2010-11-24 12 views
1

私はこれのために眠っている問題を抱えています! Labviewの下のUSBデバイスと通信するVS2005のC#DLLがあります。 C#DLLは、C++(管理されていないプロジェクト)上にあるC++ Wrapperにマウントされています(私のコードではありませんが、私はコードを所有しています。コンソールアプリにハンドルを渡すか、管理/アンマネージドヘルプ

このラッパーを使用すると(Windows/Visual Studio下で)すべての操作(データの接続、切断、送受信)を実行できます。問題はLabviewで発生します。それは接続、切断、ファイルの送信を行いますが、受信はしません(あまり役に立ちません)。私はコードをデバッグしましたが、どこに問題があるのか​​を知っていますが、修正方法はわかりません。

私はそれが管理されていないライブラリを修正するより長い方法だと思っていたので、Receiveルーチンを処理するConsole Appをコーディングすることで、この問題を乗り越えることができました。コンソールアプリケーションは、プロセスとしてC#DLLから呼び出されます。このプロセスでは、DLLから切断され、再び接続するConsoleAppを呼び出し、ファイルを要求し、HDに保存して切断します。 C#Dllは、ファイルを再接続して読み込みます。

あなたが考えることができるように、これは完了するのに時間がかかり/実用的ではありません。

DeviceApp(Handle、Ptrまたは文字列argと似ている)の開かれた参照を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; 
}; 

Unmana GED:(IInterface.h)は

class IInterface 
{ 
public: 
//Response: 
    virtual bool Deliver(CMessage mMessage); 
}; 

問題は、アンマネージコードがmInferface-を呼び出したときに>(mMessage)を提供ということです。 mParentのインスタンスはありません。その後、Wrapperでは、mParentは空です(値= null?)。それは、Unmanaged IInterfaceからのメソッドにのみアクセスし、ラッパーCInterfaceからのWrapper ^にはアクセスしないようなものです。 mParent-> Parseを評価しようとするとクラッシュが発生します。 gcrootはGCHandle AppDomain Exceptionをスローします。 ?

私は何をすべきですか?

ありがとうございます!

答えて

0

正直言って、コンソールアプリケーションを使用してUSBとのインタフェースを行うのは簡単ですが、LabVIEWがTCPを介してアプリケーションと通信するだけです(これは組み込み済みで、他の方法のいくつかに)。

+0

VIを実行しているときに、LabviewからConsoleAppにTCPを使って通信するにはどうすればよいですか?私はグーグルで答えは見つけられませんでしたか? :/ –

+0

LabVIEWでTCPポートを開き、コンソールアプリケーション経由でそのポートに接続するだけです。基本的なTCP操作へのリンクは次のとおりです。http://zone.ni.com/devzone/cda/tut/p/id/2710他の質問がある場合は、私にもっとお気軽にお問い合わせください。 – CookieOfFortune

関連する問題