4

我有一个使用一些托管代码(用 C# 编写)的 C++/CLI DLL。我想从 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,该函数仍然不会出现在dumpbin. 那么我做错了什么?如何从 C++/CLI 类库项目中导出 C 函数?

4

1 回答 1

6

应该是配置问题。Empty project我使用模板创建了一个新项目,更改了

Configuration TypeDynamic Library (.dll)

Common Language Runtime SupportCommon Language Runtime Support (/clr)

在常规配置中并添加了对System.Core我的 C# 程序集的引用Common Properties,它现在可以工作了。

我还添加了一个 .DEF 文件来处理名称修改(当然,def 文件的名称应该设置为Linker -> Input -> Module Definition file)。

LIBRARY
EXPORTS
DoWork

希望对其他人有所帮助。

于 2012-10-11T11:00:36.903 回答