我想从非托管的C++中调用我的.NET代码。我的进程入口点是基于.NET的,因此我不必担心CLR的托管问题。我知道可以使用.NET对象的COM包装器来实现这一点,但是我希望访问托管类的单个静态方法,因此COM不是我最短/最简单的路线。
看看这个解决方案: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports 这个解决方案允许通过使用[DllExport]属性(与P / Invoke DllImport相反)对函数进行装饰,从而从C中调用C#函数。
示例:
C# 代码
class Test
{
[DllExport("add", CallingConvention = CallingConvention.StdCall)]
public static int Add(int left, int right)
{
return left + right;
}
}
C 代码:
extern "C" int add(int, int);
int main()
{
int z = add(5,10);
printf("The solution is found!!! Z is %i",z);
return 0;
}
输出:
The solution is found!!! Z is 15
更新:评论区中有一个问题和一个很好的答案:
如何在非托管项目中包含dll?
您需要链接到编译C#代码时生成的.lib文件 (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)
你的调用代码是启用了/clr
的C++,对吗?
如果是的话,你可以简单地使用using语句在你的代码中使用你的.NET dll。像这样:
#using <Mydll.dll>
然后,您可以简单地创建您管理的类的对象,如下所示:
MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();
在将其集成到不同的解决方案后,找到了这里的好方法 使用C++/CLI帮助从本机C++中使用C#:
附加IncludeDirectories ...YahooAPIWrapper
附加Dependencies ...YahooAPIWrapper.lib
并且与两个项目相关,能够通过最后一个DLL中的线程打开C#表单并从本机C++发送信息,只需要 ...APIWrapper.h 包含 - 应该更好地完成,但是它可以工作;-)
public YahooAPI()
{
new Thread(() =>
{
Thread.CurrentThread.IsBackground = true;
ShowForm();
}).Start();
}
private static Form1 form = null;
public static void ShowForm()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
form = new Form1();
Application.Run(form);
}
public void SendValues(bool[] values)
{
if (form != null && form.ready) ...
}