.net - 从使用 .NET 代码的 C++/CLI DLL 导出 C 函数

标签 .net c interop c++-cli

我有一个 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在函数声明之前,但随后我在体内使用托管类型时出错。

如果我用空 stub (只是 return 1; )和 #pragma unmanaged 替换函数的主体,函数仍然没有出现在 dumpbin .那么我做错了什么?如何从 C++/CLI 类库项目中导出 C 函数?

最佳答案

应该是配置问题。我使用 Empty project 创建了一个新项目模板,已更改
Configuration TypeDynamic Library (.dll)Common Language Runtime SupportCommon Language Runtime Support (/clr)
在 General Configuration 中添加了对 System.Core 的引用和我在 Common Properties 中的 C# 程序集现在可以使用了。

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

LIBRARY
EXPORTS
DoWork

希望能帮助别人。

关于.net - 从使用 .NET 代码的 C++/CLI DLL 导出 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12835924/

相关文章:

c# - 如何创建相对于特定文件夹的绝对路径?

c# - C#4.0任务库死锁

c - 理解内存映射

c - GCC 内联汇编——与 __volatile__ 和 "memory"有什么区别?

C 预处理器 - 无需多重解析即可连接字符串

c# - 挂起互操作 COM 对象的问题

c# - 在 Windows 10 上隐藏和显示任务栏

c# - 使用Html.TextBoxFor时如何设置文本框的宽度

c++ - OpenCL - OpenGL - Interop:如何填充 cl::ImageGL

.net - 是否可以对复杂的声明进行建模(分层/嵌套/等)?