2012-10-11 71 views
2

我有一個使用一些託管代碼(用C#編寫)的C++/CLI DLL。我想從DLL中導出純C函數 - 它將使用LoadLibraryGetProcAddress從非託管代碼調用。從使用.NET代碼的C++/CLI DLL導出C函數

在導出的函數中,我只需要創建一個實例並調用一個C#類的方法。所以,我想這一點:

extern "C" __declspec(dllexport) int __stdcall DoWork(
     const wchar_t* Param1, 
     int Param2, 
     void* Param3) 
{ 
    WorkerNamespace::ManagedClass1 worker; 
    return worker.DoWork(gcnew String(Param1), Param2, IntPtr(Param3)); 
} 

它編譯罰款,但是當我做了dumpbin CompiledDll.dll /exports沒有導出函數。

我嘗試在函數聲明之前添加#pragma unmanaged,但隨後出現在正文中使用託管類型的錯誤。

如果我有一個空存根(只是return 1;),並與#pragma unmanaged,功能仍然dumpbin顯示替換函數體。那麼我做錯了什麼?如何從C++/CLI類庫項目中導出C函數?

回答

2

一定是配置問題。我創建使用Empty project模板創建一個新的項目,在常規配置改變

Configuration TypeDynamic Library (.dll)

Common Language Runtime SupportCommon Language Runtime Support (/clr)

Common Properties加入System.Core參考,我的C#程序集和現在的工作。

我還添加了一個.DEF文件來處理名稱變形(def文件的名字當然應該在Linker -> Input -> Module Definition file中設置)。

LIBRARY 
EXPORTS 
DoWork 

希望能幫助別人。

+0

這不回答這個問題。實際的配置問題是什麼? –

+0

@HansPassant最初我使用'Class Library'模板創建了一個項目。我不知道這與我發佈的內容有什麼不同。這就是爲什麼它仍然是一個懸而未決的問題。 – Alex