如何将C静态库暴露给.Net?

时间:2016-05-21 01:36:39

标签: c++ .net dll static-libraries pragma

将C ++函数公开给C和.Net有哪些步骤?我想在C ++,C和.Net中使用相同的函数名来进行32位和64位构建。

我发布了这个问题和答案,因为我还没有在任何地方找到这些技术。

1 个答案:

答案 0 :(得分:0)

步骤如下:

  1. 将C ++函数公开为C静态库(.lib)。

  2. 使用#pragma语句将lib函数投影到DLL中。

  3. 使用.Net的DllImport属性公开DLL的功能。

  4. 有关示例,请参阅this github project.

    步骤1.创建静态库项目。创建一个C ++文件,将每个函数公开为C函数。

    extern "C" {
      void vfunc(void) { return; }
      int ifunc(int i) { return i; }
    }
    

    步骤2.创建DLL项目。将静态库指定为"附加依赖性"。创建一个C文件并放入#pragma语句将每个静态lib函数投影到.DLL中。您需要定义两个#pragma,一个用于32位,另一个用于64位。不同之处在于32位在函数名称之前需要前导下划线。没有必要的代码,仅#pragma s。

    #ifdef _M_X64
    #define Alias(func) comment(linker, "/export:" func "=" func)
    #else
    #define Alias(func) comment(linker, "/export:" func "=_" func)
    #endif
    
    #pragma Alias("vfunc")
    #pragma Alias("ifunc")
    

    步骤3.创建.Net项目。使用DllImport属性公开每个函数。

    class Program
    {
        [DllImport("c-dll.dll")]
        extern static void vfunc();
        [DllImport("c-dll.dll")]
        extern static void ifunc();
        static void Main(string[] args)
        {
            vfunc();
            int i = ifunc(1);
        }
    }
    

    虽然使用这些技术编写代码很简单,但您需要对解决方案和项目文件进行大量编辑。

    1. 设置解决方案的正确构建顺序。 DLL将取决于静态库。 .Net项目将取决于DLL。

    2. 手动编辑DLL项目文件,将32位和64位DLL构建到单独的目录中(例如Win32 \ Debug,x64 \ Debug)。

    3. 手动编辑.Net项目文件,为x86 / x64和Debug / Release(总共4个)的组合创建部分。请勿使用AnyCPUDllImport将无法使用AnyCPU。仅使用x86 / x64。

    4. 手动将.Net项目文件输出路径编辑为与上面相同的Win32 / x64目录。这将允许DllImport找到DLL,因为DLL / EXE共享同一目录。 (可选)您可以将DLL放入可发现的目录中或在DllImport中放置路径 - 但是当您使用两个DLL(32/64)时,这会有问题。