如何创建C#函数DLL然后在C中使用此函数?

时间:2017-04-05 18:08:17

标签: c# dll

我正在尝试创建一个暴露一些静态函数的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文件位于同一文件夹中。

请求任何帮助!!!

1 个答案:

答案 0 :(得分:1)

一种方法:你可能想要host CLR in your process。我会建议反对它,因为托管不是最简单的程序。 此外,它通常不需要您可以使用一些较慢的方法与非托管环境中的.Net代码进行通信(例如,将您的库作为本地服务器提供并通过网络接口访问它。正如我所见这样你就可以减少十倍的工作量。)

或者您可以使用实用程序来使用实用程序来帮助您like mentioned here