编写一个C#.NET应用程序可以调用的C++DLL

本文关键字:应用程序 调用 C++DLL NET 一个 | 更新日期: 2023-09-27 18:28:56

情况就是这样。我正在用C++编写一个后端应用程序,我的同事正在使用C#作为前端。基本上,我的后端应用程序对从C#前端接收的图像进行图像处理,并返回一个包含图像数据的文本文件。我们之前所做的是将映像写入磁盘,并使用映像的文件路径作为参数调用C++应用程序。然而,这种从磁盘写入/读取已经成为一个瓶颈,因此我们希望将C++应用程序转换为DLL。

在基本级别上,我想要的是通过DLL(C#应用程序是基于web的)将C++应用程序中的单个方法公开给C#:

int ProcessImage(System::Bitmap^ image, System::String ^results)

我该怎么做?我使用的是VC++Express 2008,我的C++代码目前使用CLR编译(尽管我在里面混合了很多原生C++代码)。

我一直在网上四处寻找,但仍然纠结于如何做到这一点。我认为C++/CLI DLL是最好的选择,但我该怎么做呢?在C/C++中为.Net互操作性编写DLL

编写一个C#.NET应用程序可以调用的C++DLL

如果您将C++函数标记为"C"函数,则PInvoke可以调用它。

您的C函数将如下所示:

extern "C" __declspec(dllexport) int Test() {
    return 1;
}

你的C#参考将是这样的:

[DllImport("test.dll")]
public static extern int Test();

如果您的C++函数是实例成员,那么您仍然可以这样做,但这需要一些技巧。

我终于想通了。你需要做的是:

  1. 在C++项目中,在Visual C++中设置选项以使用clrpure进行编译,这将使该项目成为C++/CLI
  2. 在C++项目中,通过创建一个公共引用类来公开方法:

    public ref class Interop
    {
    public:
        //! Returns the version of this DLL
        static System::String^ GetVersion() {
            return "3.0.0.0";
        }
        //! Processes an image (passed by reference)
        System::Int32^ Process(Bitmap^ image);
    }
    
  3. 在C#程序中,添加对编译的C++DLL的引用
  4. 在C#程序中,调用这些方法(即Interop::Process(myBitmapInCS)

我相信这个方法叫做"隐式p/Invoke"希望这能有所帮助!