Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.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#dll+;(MSVC编译器) 我有一个C语言的DLL,我需要从我的C++程序(本地C++,而不是C++ +CLI)调用它的一些函数。 P>一种方法是通过创建C*com服务器,然后调用C++ COM客户端的函数,如MSDN中的概述。 < P>另一种方法是在非托管进程中托管CLR,其中一个示例被概述。这是我们更喜欢的解决方案,因为我们不需要COM互操作。另一个例子是。_C#_C++_.net_Visual Studio_Dll - Fatal编程技术网

从C+调用C#dll+;(MSVC编译器) 我有一个C语言的DLL,我需要从我的C++程序(本地C++,而不是C++ +CLI)调用它的一些函数。 P>一种方法是通过创建C*com服务器,然后调用C++ COM客户端的函数,如MSDN中的概述。 < P>另一种方法是在非托管进程中托管CLR,其中一个示例被概述。这是我们更喜欢的解决方案,因为我们不需要COM互操作。另一个例子是。

从C+调用C#dll+;(MSVC编译器) 我有一个C语言的DLL,我需要从我的C++程序(本地C++,而不是C++ +CLI)调用它的一些函数。 P>一种方法是通过创建C*com服务器,然后调用C++ COM客户端的函数,如MSDN中的概述。 < P>另一种方法是在非托管进程中托管CLR,其中一个示例被概述。这是我们更喜欢的解决方案,因为我们不需要COM互操作。另一个例子是。,c#,c++,.net,visual-studio,dll,C#,C++,.net,Visual Studio,Dll,另一种方法(我相信在Matten链接的文章中也有介绍)是用C++/CLI编写包装器dll 编写一个带有DLL导出规则的C++类: #pragma once #ifdef CSCLIWRAPPER_EXPORTS #define DLLAPI __declspec(dllexport) #else #define DLLAPI __declspec(dllimport) #endif class DLLAPI CsCliWrapper { private: void *wrap;

另一种方法(我相信在Matten链接的文章中也有介绍)是用C++/CLI编写包装器dll

编写一个带有DLL导出规则的C++类:

#pragma once

#ifdef CSCLIWRAPPER_EXPORTS
#define DLLAPI __declspec(dllexport)
#else 
#define DLLAPI __declspec(dllimport)
#endif

class DLLAPI CsCliWrapper
{
private:
    void *wrap;

public:
    CsCliWrapper();
    virtual ~CsCliWrapper();
};
在项目中引用托管dll,并在实现中使用它:

#include "CsCliWrapper.h"
using namespace System;
using namespace System::Runtime::InteropServices;

CsCliWrapper::CsCliWrapper()
{
    CsPlugin^ obj = gcnew CsPlugin();

    wrap = GCHandle::ToIntPtr(GCHandle::Alloc(obj)).ToPointer();
}

CsCliWrapper::~CsCliWrapper()
{
    GCHandle h = GCHandle::FromIntPtr(IntPtr(wrap));
    h.Free();
}

但是请注意,这种方法是不可移植的,目前没有在linux或OSX上支持C++/CLI的编译器。

不确定接受哪种解决方案,因为它们都是可行的解决方案。你能提到另外两种解决方案吗?你的答案是完整的,我会接受?