如何从非托管 C Dll 中加载托管 C++ Dll?

5
我有一个现成的产品,支持编写未托管的C语言插件。它不支持托管的DLL,并且我偏好使用C#语言。
需要传回给现成产品的信息非常基本,可以保存在字符串中。
所以我想可以这样做:
1. 在C# DLL中编写大部分代码。 2. 在C++托管代码中编写包装器,调用我的C#方法。 3. 在未托管的C语言中编写基本的DLL,调用托管的C++ DLL。
现在,在托管的C++和C# DLL之间通信很容易。
但是我无法弄清楚如何从未托管的C DLL中调用托管的C++函数。 如果能提供一些简单的示例代码帮助解决问题,将不胜感激。
谢谢!
编辑: 我创建了一个Code Project文章,介绍了如何使用Alex下面的答案实现此目标。 http://www.codeproject.com/Tips/695387/Calling-Csharp-NET-methods-from-unmanaged-code
2个回答

6

你差不多做对了。只需将数字2和3放在同一个C++/CLI DLL中。你可以同时使用.NET类并从C++/CLI项目中导出C函数。

extern "C" __declspec( dllexport ) void __stdcall PureExportC(
                                                    const wchar_t* param
)
{
    CSharpAssemblyNamespace::CSharpWorker worker;
    worker.DoWork( gcnew String(param) );
}

英雄。太棒了。 - CathalMF
只是在这个基础上快速补充一点。现在需要将C# Dll放置在原始应用程序的当前目录中,而不是C++ Dll的当前目录中。有什么想法可以改变这种情况吗? - CathalMF
@CathalMF 你可能可以将C#和C++/CLI程序集链接在一起,得到一个DLL文件。我没有尝试过,但是这个答案或者ILMerge可能会有用。 - Alex

1
我认为你不能做到这一点。但是,你可以为该产品编写一个C++(非托管)插件。然后使用C#编写一个独立的托管应用程序,从插件启动它,并使用命名管道或套接字进行通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接