将句柄传递给控制台应用程序或托管/非托管帮助

时间:2010-11-24 11:53:53

标签: c# console unmanaged wrapper labview

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

我该怎么办?

谢谢!

1 个答案:

答案 0 :(得分:0)

老实说,只需使用您的控制台应用程序就USB接口进行操作就更容易了,然后只需让LabVIEW通过TCP与应用程序通信(因为它内置且相对易于使用一些其他方法)。