Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
编写C++;C#.NET应用程序可以调用的DLL?_C#_.net_Dll_C++ Cli_Interop - Fatal编程技术网

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

编写C++;C#.NET应用程序可以调用的DLL?,c#,.net,dll,c++-cli,interop,C#,.net,Dll,C++ Cli,Interop,情况就是这样。我在C++中写后端应用程序,我的同事们用C语言来做前端。基本上,我的后端应用程序对从C#前端接收的图像进行图像处理,并返回一个包含图像数据的文本文件。 我们之前做的是把图像写入磁盘,并调用C++应用程序,其中的图像路径是一个参数。但是,从磁盘上的读写已经成为一个瓶颈,所以我们希望把C++应用程序转换成一个DLL。 在基本层次上,我想通过DLL(C语言应用程序是基于Web的)将一个从C++应用程序中的单个方法暴露到C语言中: 我该怎么做呢?我使用VC++Express 2008,我的

情况就是这样。我在C++中写后端应用程序,我的同事们用C语言来做前端。基本上,我的后端应用程序对从C#前端接收的图像进行图像处理,并返回一个包含图像数据的文本文件。 我们之前做的是把图像写入磁盘,并调用C++应用程序,其中的图像路径是一个参数。但是,从磁盘上的读写已经成为一个瓶颈,所以我们希望把C++应用程序转换成一个DLL。

在基本层次上,我想通过DLL(C语言应用程序是基于Web的)将一个从C++应用程序中的单个方法暴露到C语言中:

我该怎么做呢?我使用VC++Express 2008,我的C++代码用CLR编译(虽然我在里面混合了很多本地C++代码)。 我一直在网上四处寻找,但仍在思考如何做到这一点。我认为C++/CLI DLL是最好的选择,但我该如何做到这一点?

如果你将C++函数标记为“C”函数,那么它可以由PInvoke调用。< /P> 您的C函数将如下所示:

extern "C" __declspec(dllexport) int Test() {
    return 1;
}
[DllImport("test.dll")]
public static extern int Test();
您的C#参考资料如下:

extern "C" __declspec(dllexport) int Test() {
    return 1;
}
[DllImport("test.dll")]
public static extern int Test();

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

< P>我终于明白了。您需要做的是:

  • 在C++项目中,在VisualC++中设置选项,用CLR <强>纯< /> >,这使得项目成为C++ +CLI ON/LI>

    在C++项目中,通过创建公共REF类公开方法:

    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);
    }
    
  • 在C++程序中,添加对编译的的C++ DLL的引用
  • 在C#程序中,调用这些方法(即,
    Interop::Process(myBitmapInCS)
  • 我相信这个方法叫做“隐式p/Invoke”
    希望这有帮助

    可能的副本也应该添加到.C++函数中,或者调用DLimPurTI约定,EXTEN“C”阻止函数/方法名称的篡改。只有全局命名空间中的函数才能以与P/Unjk兼容的方式导出。忘记与类有关的任何事情,不管你是指类的成员函数(静态还是非静态)还是参数或返回值中的类类型。谢谢你的回答,但我认为这与我正在尝试的工作不起作用。如何使用此方法通过引用传递图像并以字符串形式接收结果?