2011-03-02 70 views
4

我正在使用Visual Studio 2008 Professional,並且需要創建兩個項目的解決方案。一個項目是託管WinForms C#項目,其次是非託管DLL C++項目。非託管DLL項目和託管WinForms應用程序在一個解決方案中

我在VS2008和非託管DLL項目中創建了它們,我導出了簡單的函數,它返回一些int。在管理WinForms項目我導入的DLL在通常的方式,並試圖在標籤打印返回值:

[DllImport("DllProj.dll", EntryPoint = "GetSomeInt", SetLastError = true)] 
private static extern int GetSomeInt(); 

但是當我建立的解決方案和運行,我得到DllNotFoundException。我也嘗試添加一個現有的項目(DllProj.dll)到WinForms項目,但它只是將其Debug文件夾中的該dll複製到WinForms項目的文件夾中,而不是在編譯項目所在的Debug子文件夾中。所以我仍然得到DllNotFoundException

我也嘗試添加它作爲參考,但VS2008抱怨說我的DLL不是COM或管理對象。有沒有一些方法來配置解決方案,使得我不需要在每次構建之後手動將編譯的DLL複製到WinForms項目的Debug子文件夾中?

回答

6

你應該添加dll副本到發佈後的事件。

請參閱Project properties>Build events>Post build event command line

+0

好吧,我在那裏,我看到後生成事件命令行。你能告訴我那個複製它的魔法命令嗎?對不起,但我第一次這樣做,從來沒有使用過。 – sanjuro 2011-03-02 14:22:44

+1

使用簡單的bat-file語法。例如,「複製c:\ MyProjectSource \ mydll.dll c:\ MyDestination \」 – acoolaum 2011-03-02 14:25:37

+0

好吧,非常感謝,現在我知道如何做到這一點 – sanjuro 2011-03-02 14:28:24

2
  • 複製編譯的.dll文件到的WinForms項目中的每個之後建立
  • 右鍵單擊該DLL(駐留在WinForms項目),單擊屬性
  • 設置「複製到輸出目錄」爲「複製,如果新」
+0

Thansk人,它的工作原理,但是當我改變DLL項目中的東西時,它不會反映在WinForms應用程序的結果中。所以沒有辦法像我想象的那樣配置它?沒有必要每次我改變DLL手動複製它? – sanjuro 2011-03-02 14:13:40

+1

@sanjuro,如我所說,你應該添加複製腳本來發布項目的構建事件。後構建事件在每次構建後運行。 – acoolaum 2011-03-02 14:19:42

+0

我從你以前的文章中知道,但不知道這個副本腳本是怎麼樣的。 :) – sanjuro 2011-03-02 14:26:42

2

的DllImport是消耗的非託管的dll的正確方法,因爲C++項目是不受管理的,你不能將它添加爲C#referemce windowsforms應用程序,你必須手動複製或用postbuild事件的C++ DLL通過使用Dll導入到託管應用程序的bin文件夾。

相關問題