我有一个C ++ / CLI DLL,它使用一些托管代码(用C#编写)。我想从DLL导出一个纯C函数 - 它将使用LoadLibrary
和GetProcAddress
从非托管代码调用。
在导出的函数中,我只需要创建一个实例并调用一个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
替换函数的主体,则函数仍然不会显示在{{1 }}。那么我做错了什么?如何从C ++ / CLI类库项目导出C函数?
答案 0 :(得分:4)
一定是配置问题。我使用Empty project
模板创建了一个新项目,已更改
Configuration Type
至Dynamic Library (.dll)
Common Language Runtime Support
至Common Language Runtime Support (/clr)
在“常规配置”中添加了对System.Core
中的Common Properties
和我的C#程序集的引用,现在可以正常运行。
我还添加了一个.DEF文件来处理名称修改(def文件的名称当然应该在Linker -> Input -> Module Definition file
中设置)。
LIBRARY
EXPORTS
DoWork
希望能帮助别人。