1

因为这个,我有睡眠问题!我有一个 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 异常。?

我应该怎么办 ??

谢谢 !

4

1 回答 1

0

老实说,使用控制台应用程序完成与 USB 接口相关的所有操作会更容易,然后让 LabVIEW 通过 TCP 与应用程序通信(只是因为它是内置的并且与某些其他方法)。

于 2010-11-24T21:45:19.980 回答