【发布时间】:2021-11-04 16:27:17
【问题描述】:
有没有人从 C 模块调用 C# 模块。我尝试在互联网上搜索,但没有找到好的例子。尽管很多网站都说使用 COM 互操作,但找不到合适的示例或文章来解释它。
如果有人可以帮助我,那就太好了
谢谢, 盗贼
【问题讨论】:
有没有人从 C 模块调用 C# 模块。我尝试在互联网上搜索,但没有找到好的例子。尽管很多网站都说使用 COM 互操作,但找不到合适的示例或文章来解释它。
如果有人可以帮助我,那就太好了
谢谢, 盗贼
【问题讨论】:
如果您想从 C 或 C++ 调用托管代码,则不仅仅是 COM 互操作。还有以下鲜为人知的方法(取自 MSDN FAQ):
如何从本机 Visual C++ 调用 .NET 程序集?
基本上有四种方法 从原生 VC++ 代码调用 .NET 程序集:
CLR Hosting API:原生 VC++ 模块调用 CLR Hosting APIs 来托管 CLR,加载和调用 .NET 程序集(示例代码:CppHostCLR)。
COM Interop:如果 .NET 程序集可以作为 COM 组件公开,则本机 VC++ 模块可以通过 .NET – COM interop 调用 .NET 程序集(示例代码:CppCOMClient) .
反向 PInvoke:托管代码调用本机代码,传递本机代码可以回调的委托(示例代码:CSPInvokeDll)。
C++/CLI:如果包含原生VC++代码的模块允许enable CLR,原生VC++代码可以调用 .NET 直接组装(示例代码:Consuming C# Library in native C or C++ using C++/CLI)
【讨论】:
这里有一个解决方案。该解决方案允许通过使用 [DllExport] 属性(与 P/Invoke DllImport 相对)装饰您的函数来从 C 调用 C# 函数。
https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
C#代码
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C 代码
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
正如@iceflow19 评论如下:
链接的作者提供了一个 CLR IL 预处理器作为编译期间的附加步骤。由于程序集在 Windows 上使用相同的二进制容器格式 (DLL),因此如果您手动将 IL 中的 .Net 函数偏移量添加到 vtable(dll 的导出列表),Windows 足够智能,可以在调用时调用 CLR 来运行该代码来自 C. 但是有开销。这是一个未经宣传的功能。这就是 C++/CLI 中混合托管库的工作方式。要使用它,只需通过 Nuget 添加它。在您的 MSBuild 项目文件中添加的额外目标将提供 IL 预处理步骤
【讨论】:
LoadLibraryFreeLibrary等吗
【讨论】: