2009-06-11 93 views
7

我使用命令行(csc)創建了一個dll。假設dll包含Add(int,int)方法。現在我想在vC++中使用那個添加函數?如何在vC++中使用c#dll?

如何做到這一點?

您的幫助將得到很大的讚賞。

這是我在做什麼。

vcproj;對於這個項目我有右鍵單擊和鏈接器部分添加額外的依賴關係。添加dll所在的路徑。

的main.cpp

using namespace Test 

void main() 

{ 

    demo d; 

    d.add(5,5); 

} 

錯誤命名空間試驗不存在。

如何解決這個問題?

我需要使用DLL作爲非託管代碼

回答

9

你的C#程序集需要的標記有ComVisible特性的屬性(除一些其他的東西)。

[assembly: ComVisible(true)] 

還有a guide to doing this here

+2

如果C++應用程序被管理,那麼它當然比這更容易,你可以完全避免使用COM。 – Noldorin 2009-06-11 12:35:46

+0

@Matthew Brindley我做了什麼http://support.microsoft.com/kb/828736給出,但我得到一個錯誤,不能從'const _GUID'轉換爲'const IISWebFrameworkDAAB :: DataAccessInterface'「我應該怎麼做? – user1402643 2012-10-08 07:43:36

8

從MSDN論壇Calling C# from unmanaged C++

你想要做將 什麼只編譯您要 加載C#代碼/ CLR,然後使用C++/CLI調用 掉的文件。其餘 應用程序將保持原生態,而您編譯的文件/ clr將與原生和CLR混合使用 。您應該可以使用 C++/CLI語法將 調用到您的C#庫中。

一旦你把那 文件中的一個文件中的cl.exe 命令行上/ CLR,你可以調用任何管理要代碼 ,不管它是否 寫在VB.net,C#或者 C++/CLI。這是迄今爲止最簡單的 的方式來做你想做的事情(從你的本地C++應用程序調用C# 代碼), 雖然它有它的警告和 的限制。大致雖然「It Just Works」。另外,它比p/invokes的更快。

2

這非常依賴於您正在構建的C++應用程序的類型。如果您正在構建C++/CLI程序集,那麼您需要確保該項目具有對C#DLL的引用。一旦完成,您應該能夠按照書面形式鍵入代碼,從而讓您對Demo有如此定義。

namespace Test { 
    public class demo { 
    public void add(int left, int right) { 
     ... 
    } 
    } 
} 

如果您正在構建一個正常的,非託管的C++項目,那麼您必須使用COM互操作來訪問程序集。這涉及在您的C#項目COMVisible中創建演示類型並將其註冊爲COM互操作。之後,您可以像訪問其他COM組件一樣訪問它。