首页 > 解决方案 > 使用 /clr:netcore 从非托管 C++ 调用 .dll 构建

问题描述

我有一个非托管 C++ 应用程序,它通过供应商 DLL 连接到不同的数据源。对于 .Net 框架 DLL,我曾经创建 /clr 项目,它对我有用,没有任何问题。

但是现在我需要使用 .Net 5 DLL,并且不能让它这样工作。要混合非托管代码和 .net 5 代码,我必须使用仅作为 DLL 构建的 /clr:netcore,但我的应用程序应该是 Windows 服务,因此我使用 /clr:netcore 为供应商创建了一个包装 DLL .Net 5 DLL少数导出的方法(非托管)。使用 .def 文件指定导出的方法。

wrapper.h
    typedef int(__stdcall* PHCallback)(void* client, LPCTSTR strItem, void* data);

    void* __declspec(dllexport) CreateClient(LPCTSTR params);
    bool __declspec(dllexport) Connect(void* client);
    void __declspec(dllexport) SetCallback(void* client, PHCallback* pCallback);
    void __declspec(dllexport) SendRequest(void* client, LPCTSTR request);

在这个包装器中,CreateClient 创建了一个在供应商的 DLL 中定义的对象的实例,因此我可以稍后在其他方法中使用它。SetCallback 设置数据准备好时调用的回调,没什么特别的。

编译 Wrapper.dll 得到 .lib 和 .dll 文件 - 到目前为止一切都很好。

然后我尝试将我的非托管应用程序与该 Wrapper.dll 链接(使用头文件和 .lib)。一切都编译得很好......但是当我尝试启动/调试我的应用程序时,我收到一个错误“找不到依赖的 dll”。

所有 .lib/.dll/.exe 都在同一个目录中。如果我使用 DependancyWalker 打开 .exe - 它说它也找不到 wrapper.dll(为什么?)如果我直接在 DependancyWalker 中打开 wrapper.dll - 它会显示并且我所有导出的方法都在那里。

那么我需要做什么才能完成这项工作?还是无法以这种方式从非托管 c++ 中使用 .net 5.0 DLL?

标签: c++clrmanagedunmanagedexports

解决方案


推荐阅读