因为这个问题,我正在睡觉!我有一个VS2005 C#DLL,它应该与Labview下的USB设备通信。 C#DLL安装在C ++ Wrapper上,而C ++ Wrapper是在C ++(非托管)项目上编写的(不是我编写的,但我拥有代码.btw .C ++和我,我们不是最好的朋友)。
使用这个包装器,我可以(在Windows / Visual Studio下)执行所有操作(连接,断开连接,发送和接收数据)。 Labview下出现问题。它连接,断开连接,发送文件,但它没有收到(不是很有用)。我调试了代码,知道问题出在哪里,但我不知道如何修复它。 (我可以尝试解释一下)
由于我认为修复非托管库是一种较长的方法,我意识到通过编写处理Receive例程的Console App,我可以跳过这个问题。 Console应用程序作为进程从C#DLL调用。在此过程中,它断开与DLL的连接,调用再次连接的ConsoleApp,请求文件,将其保存到HD并断开连接。 C#Dll重新连接并加载文件。
正如您所想,这需要一些漫长/不切实际的时间才能完成。我想到了两个选项/问题:
有没有办法可以将设备的打开引用(Handle,Ptr或类似字符串arg)传递给ConsoleApp,这样我就不必再次连接而只需要请求。怎么样 ?
或者它应该更容易修复非托管代码,以便我不会有这个问题,我可以直接从C#DLL工作?
Managed / Unmanaged就是这样的:
包装:(wrapper.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;
};
包装(wrapper.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-&gt; Deliver(mMessage)时; mParent没有实例。然后,在Wrapper中,mParent为空(value = null?);就像它只能访问来自Unmanaged IInterface的方法而不是来自包装器CInterface的Wrapper ^。当试图评估mParent-&gt; Parse时崩溃。 gcroot抛出GCHandle AppDomain异常。 ?
我该怎么办?
谢谢!
答案 0 :(得分:0)
老实说,只需使用您的控制台应用程序就USB接口进行操作就更容易了,然后只需让LabVIEW通过TCP与应用程序通信(因为它内置且相对易于使用一些其他方法)。