2008-11-14 23 views
1

我正在與一個Dll一起構建一個項目。使用/ clr中的混合DLL:純項目

該Dll必須支持本機代碼,所以我將其聲明爲/ clr。 我的項目最初也是一個/ clr項目,一切都很好。不過,我想包括一些NUnit測試,所以我不得不將我的主項目從/ clr切換到/ clr:pure。

一切仍然編譯,但任何Dll調用都會生成運行時錯誤。當我恢復到/ CLR一切正常

在我的DLL,導出的函數聲明如下:

#define DllExport __declspec(dllexport) 
DllExport bool DisplayScan(bool bShow, bool bAllPasses) { } 

我也做了包含全部導出函數

實名.def文件
LIBRARY "Controller" 
EXPORTS 
DisplayScan 

從我的主要項目進口貨值聲明如下:

#define _DllImport [DllImport("Controller.dll", CallingConvention = CallingConvention::Cdecl)] static 
_DllImport bool DisplayScan(bool bShow, bool bAllPasses) 

有人遇到過這樣的問題嗎?

回答

3

好吧一切正在工作

事實上,它一直在努力從一開始。

道德:直到你從函數返回其在/ CLR OK:不要試圖施放一個char *成的std :: string

奇怪的事情。它立即崩潰在/ clr:純

3

基本上你正在做一些不被支持;/clr:純和本地DLL導出。從this MSDN article引用「由於純彙編中的入口點使用__clrcall調用約定,純彙編不能導出可從本機函數調用的函數。」

我不確定最佳的解決方法。但是,通過一些實驗,您可以利用/ clr選項利用__clrcall調用約定。 Here's a link可能有用。從我可以收集的內容中,您應該能夠導出這些託管類並從託管程序集(如託管的NUnit測試項目)中使用它們,但請使用不同的方法簽名保留您的非託管導出。請記住,只要通過導出公開任何.net類,它就需要使用__clrcall調用約定。

0

您的問題呼喚conventionCallingConvention = CallingConvention :: CDECL ...定義函數一樣,或使用STDCALL或clrcall,clecl是純C

或問題是在這裏: 定義函數extern不是靜態

1

優勢/ CLR的:純

更好的性能:由於純組件只包含MSIL,沒有本機的功能,因此沒有管理/非託管的轉變是必要的。 (通過P/Invoke進行的功能調用是此規則的一個例外。)

AppDomain Awareness:管理函數和CLR數據類型存在於應用程序域內,這會影響其可見性和可訪問性。純的程序集是可識別域的(每種類型都隱含有__declspec(appdomain)),因此從其他.NET組件訪問它們的類型和功能更加簡單和安全。因此,純組件與混合程序集相比,可以更輕鬆地與其他.NET組件進行交互操作。

非磁盤加載:純粹的程序集可以加載到內存中,甚至流式傳輸。這對使用.NET程序集作爲存儲過程至關重要。這與混合程序集不同,後者由於依賴於Windows加載機制,必須存在於磁盤上才能執行。

反思:不可能反映混合的可執行文件,而純粹的程序集提供全面的反射支持。有關更多信息,請參閱反射(C++/CLI)。

主機可控性:因爲純粹的程序集只包含MSIL,所以在託管CLR並修改其默認行爲的應用程序中使用時,它們的行爲比混合程序集更具可預測性和靈活性。純

本節介紹當前不/ CLR支持的功能:純/ CLR的

限制。

純組件不能由非託管函數調用。因此,純粹的程序集不能實現COM接口或公開本機回調。純組件不能通過__declspec(dllexport)或.DEF文件導出函數。此外,使用__clrcall約定聲明的函數不能通過__declspec(dllimport)導入。本地模塊中的函數可以從純集合中調用,但純集合不能公開純集合函數,因此在純集合中公開功能必須通過混合程序集中的託管函數完成。有關更多信息,請參見如何:遷移到/ clr:pure(C++/CLI)。

在Visual C++中純模式編譯不支持ATL和MFC庫。

Pure .netmodules不被接受爲Visual C++鏈接器的輸入。但是,鏈接器接受純.obj文件,而.obj文件包含netmodules中包含的信息的超集。有關更多信息,請參閱.netmodule文件作爲鏈接器輸入。

不支持編譯器COM支持(#import),因爲這會將非託管指令引入到純組件中。

用於對齊和異常處理的浮點選項對於純組件不可調整。因此,不能使用__declspec(align)。這會呈現一些頭文件,如fpieee.h,與/ clr:pure不兼容。

使用/ clr:pure編譯時​​,PSDK中的GetLastError函數可能會導致未定義的行爲。

相關問題