繁体   English   中英

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

[英]Writing a C++ DLL that a C# .NET Application can call?

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

在基础层面,我想要的是通过DLL将C ++应用程序中的单个方法暴露给C#,C#应用程序是基于Web的:

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

我该怎么做呢? 我正在使用VC ++ Express 2008,我的C ++代码目前使用CLR进行编译(尽管我在内部混合了很多本机C ++代码)。

我一直在网上寻找,但我仍然坚持如何做到这一点。 我认为C ++ / CLI DLL是最好的选择,但我该怎么做? 用C / C ++编写DLL以实现.Net互操作性

如果将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 ++中设置选项以使用clr pure进行编译,这使得项目成为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”希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM