我正在尝试创建一个暴露一些静态函数的DLL,然后在C中使用。
最近我读了一篇名为“托管/非托管代码互操作性概述”的微软文章,其中没有关于如何“将托管API公开为平面API”的明确解释。
我将此插件安装到Visual Studio(https://www.nuget.org/packages/UnmanagedExports)但我仍然无法在C中编译项目。
我的C#项目公开了这样的函数:
using RGiesecke.DllExport;
using System.Runtime.InteropServices;
namespace libcallcstest
{
public class Class1
{
[DllExport("add", CallingConvention = CallingConvention.Cdecl)]
public static int add(int a, int b)
{
return a + b;
}
}
}
构建项目后,产生以下三个文件:
libcallcstest.dll
libcallcstest.pdb
libcallcstest.tlb
我的C代码是:
#include <stdio.h>
#include <stdlib.h>
int add(int, int);
int main(int argc, char** argv) {
int z = add(2,5);
printf("%d\n", z);
return (EXIT_SUCCESS);
}
最后当我尝试使用以下代码编译此文件时
gcc -o main.exe main.c -lcallcstest
无法正常工作,通过构建C#项目创建的文件与main.c文件位于同一文件夹中。
请求任何帮助!!!
答案 0 :(得分:1)
一种方法:你可能想要host CLR in your process。我会建议反对它,因为托管不是最简单的程序。 此外,它通常不需要或您可以使用一些较慢的方法与非托管环境中的.Net代码进行通信(例如,将您的库作为本地服务器提供并通过网络接口访问它。正如我所见这样你就可以减少十倍的工作量。)
或者您可以使用实用程序来使用实用程序来帮助您like mentioned here。