2012-03-23 85 views
1

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

在基本层面,我要的是通过一个DLL从我的C++应用程序到C#一个公开一个方法(C#应用程序是基于Web):

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

我怎么能去关于这样做?我正在使用VC++ Express 2008,我的C++代码目前正在用CLR编译(尽管我在里面混合了很多本地C++代码)。

我一直在四处寻找在网络上,但我仍然停留在如何做到这一点。我认为一个C++/CLI DLL是最好的选择,但我该怎么做? Writing a DLL in C/C++ for .Net interoperability

+1

[C++/CLI混合模式DLL创建]的可能重复(http://stackoverflow.com/questions/2691325/c-cli-mixed-mode-dll-creation) – 2012-03-23 00:15:17

回答

1

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

  1. 在你的C++项目,设置在Visual C++的选项使用CLR ,这使得项目编译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#程序,添加到您编译
  4. 在C#程序中的C++ DLL的引用,调用这些方法(即Interop::Process(myBitmapInCS)

我相信这种方法被称为“隐式P/Invoke” 希望这有助于!

2

如果您标记您的C++函数为“C”的功能,那么就可以通过的PInvoke调用。

你的C函数看起来就像这样:

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

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

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

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

+2

您还应该添加__stdcall到C++函数,或CallingConvention到DllImport – 2012-03-23 01:29:43

+1

我相信extern“C”可以防止函数/方法名称混乱。 – 01100110 2012-03-23 02:37:16

+0

只能以与p/invoke兼容的方式导出全局名称空间中的函数。忘记任何与类有关的事情,无论你指的是类的成员函数(静态的还是非静态的)或参数或返回值中的类类型。 – 2012-03-23 02:58:45

相关问题