因为这个,我有睡眠问题!我有一个 VS2005 C# DLL,它应该与 Labview 下的 USB 设备通信。C# DLL 安装在 C++ 包装器上,该包装器位于 C++(非托管)项目(不是我编写的,但我拥有代码。顺便说一句。C++ 和我,我们不是最好的朋友)。
使用这个包装器,我可以(在 Windows/Visual Studio 下)做所有事情(连接、断开连接、发送和接收数据)。问题出现在 Labview 下。它连接、断开连接、发送文件但它不接收(不是很有用)。我已经调试了代码,知道问题出在哪里,但我不知道如何解决它。(我可以试着解释一下)
因为我认为修复非托管库的方法更长,所以我意识到通过编写一个处理 Receive 例程的控制台应用程序,我可以跳过这个问题。控制台应用程序作为进程从 C# DLL 调用。在这个过程中,它与 DLL 断开连接,调用再次连接的 ConsoleApp,请求文件,将其保存到 HD 并断开连接。C# Dll 重新连接并加载文件。
如您所想,这需要一些很长/不切实际的时间才能完成。我想到了两个选项/问题:
有没有一种方法可以将设备的打开引用(句柄、Ptr 或类似字符串 arg)传递给 ConsoleApp,这样我就不必再次连接而只需请求。如何 ?
或者修复非托管代码应该更容易,这样我就不会遇到这个问题,我可以直接从 C# DLL 工作?
托管/非托管是这样的:
包装器:(包装器.h)
public ref class Wrapper
{
public:
Send(String^ mSendMessage);
Parse(String^ mMessageString);
...
private:
ComLayer* mComm;
CInferface mInterface;
};
private class CInterface : public IIterface
{
public:
virtual bool Deliver(CMessage mMessage);
...
private:
gcroot<Wrapper^> mParent;
};
包装器(包装器.cpp)
Wrapper::Send(String^ mSendMessage)
{
...
mComm->Send(mMessage);
}
Wrapper::Parse(String^ mMessageString)
{
...
}
CInterface::Deliver(CMessage* mMessage)
{
...
//Here, mParent value is empty under Labview, not while Debug/VS/WindowsForm
mParent->Parse(mMessageString)
}
非托管:(commLayer.h)
class CommLayer
{
public:
//Send:
bool Send(CMessage* mMessage);
...
private:
//instead of CInterface, IInterface.
IInterface mInterface;
};
非托管:(IInterface.h)
class IInterface
{
public:
//Response:
virtual bool Deliver(CMessage mMessage);
};
问题是当非托管代码调用 mInferface->Deliver(mMessage) 时;mParent 没有实例。然后,在 Wrapper 中,mParent 为空(value = null ?);就像它只会访问来自非托管 IInterface 的方法,而不是来自包装器 CInterface 的 Wrapper^。尝试评估 mParent->Parse 时发生崩溃。gcroot 引发 GCHandle AppDomain 异常。?
我应该怎么办 ??
谢谢 !