これのせいで寝不足です!Labview で USB デバイスと通信する必要がある VS2005 C# DLL があります。C# DLL は、C++ (アンマネージ) プロジェクト (私がコーディングしたものではありませんが、コードは私が所有しています。ところで、C++ と私、私たちは親友ではありません) の上にある C++ ラッパーにマウントされています。
このラッパーを使用すると、(Windows/Visual Studio で) すべてを実行できます (接続、切断、データの送受信)。この問題は Labview で発生します。接続、切断、ファイルの送信は行いますが、受信はしません (あまり役に立ちません)。コードをデバッグしました。問題の場所はわかっていますが、修正方法がわかりません。(私はそれを説明しようとすることができました)
管理されていないライブラリを修正するには時間がかかると思っていたので、Receive ルーチンを処理するコンソール アプリをコーディングすることで、この問題を回避できることに気付きました。コンソール アプリは、C# DLL からプロセスとして呼び出されます。このプロセスでは、DLL から切断し、再度接続する ConsoleApp を呼び出し、ファイルを要求し、それを HD に保存して切断します。C# DLL が再接続し、ファイルをロードします。
ご想像のとおり、これを完了するには長く/非現実的な時間がかかります。私は2つのオプション/質問について考えました:
デバイスの開かれた参照 (ハンドル、Ptr、または文字列引数として類似) を ConsoleApp に渡す方法はありますか? どのように ?
または、この問題が発生せず、C# DLL から直接作業できるように、アンマネージ コードを修正する方が簡単なはずですか?
マネージド/アンマネージドは次のようになります。
ラッパー:(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->Deliver(mMessage) を呼び出すときです。mParent のインスタンスはありません。次に、Wrapper で mParent が空です (値 = null ?)。Unmanaged IInterface からのメソッドにのみアクセスし、ラッパー CInterface からの Wrapper^ にはアクセスしないようです。mParent->Parse を評価しようとすると、クラッシュが発生します。gcroot が GCHandle AppDomain Exception をスローします。?
私は何をすべきか ??
ありがとう !