在不使用COM的情况下从非托管C++应用程序调用C# dll

5
有没有一种不使用COM的方法,可以在C++非托管应用程序中调用C# DLL?

你可以随时嵌入Mono... - cdhowie
可以通过混合模式 DLL 完成。 - Sandeep Singh Rawat
可能是从C++调用C#代码的重复问题。 - cdiggins
这里列出了多种技术:https://dev59.com/VXRA5IYBdhLWcg3w8SeJ#23182821 - cdiggins
4个回答

5
您可以使用Reverse P/Invoke来实现这一点 - 示例和讨论在这里

1
谢谢。那很有趣。 - Victor Ronin

2
实际上,可以对IL进行反汇编、修改并导出函数后重新组装。几年前我曾尝试过这个操作,并创建了一个应用程序,可以将dll反汇编,提供可能导出的函数列表,允许用户选择,然后重写IL并重新组装所有内容。然后,我可以直接从非托管代码中调用dll...或者从托管代码中使用p-invoke调用dll(虽然不太实用,但仍然有趣)。
显然,这在.net语言本身中没有得到支持(即使在MSIL中也支持)。我不会在生产环境中使用它。
失效链接: http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/ Wayback Machine: https://web.archive.org/web/20140213030149/http://www.csharphelp.com/2007/03/exporting-managed-code-as-unmanaged/

1
它在C++/CLI中得到支持,当你__declspec(dllexport)一个静态的C++/CLI函数时,它会自动创建一个thunk来加载CLR。这当然是个大技巧,因为没有加载CLR就无法运行托管代码。 - Hans Passant
@Hans 当您将导出添加到您的IL中时,ILASM将完成一切所需的工作,使您的程序集可以像本机程序集一样被使用。 - Robert Giesecke

1

我可能有点晚了,但是看看this

使用这个小的msbuild任务,您可以创建一个C#库,可以像本地DLL一样调用它。(例如,为需要它们为本地dll的应用程序编写插件)

哦,不要忘记使用项目模板,它会为您设置一切。


0

你唯一的选择就是使用C++.net或者创建一个C++.net包装器,以导出你所需的内容。

从C++调用C#代码


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