Visual c++ 在C+;中从非托管调用托管代码时出错+/CLI

Visual c++ 在C+;中从非托管调用托管代码时出错+/CLI,visual-c++,c++-cli,interop,unmanaged,managed,Visual C++,C++ Cli,Interop,Unmanaged,Managed,我正在为一个程序编写一个“驱动程序”,该驱动程序与网络上的一些设备进行通信。我已经有了C#软件与设备一起工作,所以计划重用代码。 因此,驱动程序dll实际上是程序和已经可用的程序集之间的互操作,它是用C++/CLI编写的。程序调用接口中描述的方法,互操作dll调用C#代码,这就是我的看法 我使用#pragma unmanaged DeviceSearch::DeviceSearch(IDeviceSearchHandler* handler):m_handler(handler) { M

我正在为一个程序编写一个“驱动程序”,该驱动程序与网络上的一些设备进行通信。我已经有了C#软件与设备一起工作,所以计划重用代码。
因此,驱动程序dll实际上是程序和已经可用的程序集之间的互操作,它是用C++/CLI编写的。程序调用接口中描述的方法,互操作dll调用C#代码,这就是我的看法

我使用
#pragma unmanaged

DeviceSearch::DeviceSearch(IDeviceSearchHandler* handler):m_handler(handler)
{
    ManagedWrapper mw;
    mw.Init();
}
显然,ManagedRapper是在托管代码中实现的

void ManagedWrapper::Init()
{

    //some code
}
然而,问题出现在这里。如果In()是空的,或者调用C++中定义的方法/类,它就可以正常工作。但是,如果我尝试调用C#代码(使用#using引用,其中Facade.dll是执行某些函数的C#dll),则在调用mw.Init()时,即使在它内部,我也能正确地获得访问冲突异常

我是否遗漏了使互操作正常工作所应该做的一些非常明显的事情?网络上的大多数信息只是告诉我们它应该“正常工作”

看看这是否有帮助:

“在你的C++代码中定义一个抽象接口类,然后在托管C++中创建一个具体的子类。在方法实现中调用C对象。

最后,导出一个工厂函数,该函数将实例化实现类,并返回本机代码可以使用的基类指针。”

查看这是否有帮助:

“在你的C++代码中定义一个抽象接口类,然后在托管C++中创建一个具体的子类。在方法实现中调用C对象。


最后,导出一个工厂函数,该函数将实例化实现类并返回本机代码可以使用的基类指针。“

(1)确保启用了混合模式调试。(2) 将
Init
中的所有代码移动到私有助手方法。如果现在Init开始成功运行,并且在调用helper方法时崩溃,那么您正在使用的某个C#type无法JIT。如果在调用(几乎为空)
Init
方法时仍然失败,则您的本机代码已损坏.NET运行时引擎。它仍然失败。我也实现了答案中描述的解决方案,但仍然失败。如何诊断和消除腐败?还是使用另一种互操作方法更好?(1)确保启用了混合模式调试。(2) 将
Init
中的所有代码移动到私有助手方法。如果现在Init开始成功运行,并且在调用helper方法时崩溃,那么您正在使用的某个C#type无法JIT。如果在调用(几乎为空)
Init
方法时仍然失败,则您的本机代码已损坏.NET运行时引擎。它仍然失败。我也实现了答案中描述的解决方案,但仍然失败。如何诊断和消除腐败?还是使用另一种互操作方法更好?