Передача дескриптора в консольное приложение ИЛИ управляемая/неуправляемая справка

У меня проблемы со сном из-за этого! У меня есть DLL C# VS2005, которая должна связываться с USB-устройством под Labview. DLL C# монтируется поверх C++ Wrapper, который находится над C++ (неуправляемым) проектом (не закодирован мной, но я владею кодом. Кстати, C++ и я, мы не лучшие друзья).

Используя эту оболочку, я могу (под Windows/Visual Studio) делать все (подключаться, отключаться, отправлять и получать данные). Проблема возникает под Labview. Он подключается, отключается, отправляет файлы, но не получает (не очень полезно). Я отладил код, знаю, в чем проблема, но не знаю, как ее исправить. (Я мог бы ПОПЫТАТЬСЯ объяснить это)

Поскольку я думал, что это более длительный способ исправить неуправляемую библиотеку, я понял, что, написав консольное приложение, которое обрабатывает процедуру получения, я могу обойти эту проблему. Консольное приложение вызывается из DLL C# как процесс. В этом процессе он отключается от DLL, вызывает ConsoleApp, который снова подключается, запрашивает файл, сохраняет его на HD и отключается. C# Dll повторно подключается и загружает файл.

Как вы могли подумать, это занимает некоторое время. Я думал о двух вариантах/вопросах:

Есть ли способ, которым я мог бы передать ConsoleApp открытую ссылку на устройство (дескриптор, Ptr или аналогичный строковому аргументу), чтобы мне не пришлось снова подключаться, а только запрашивать. Как ?

ИЛИ должно быть проще исправить неуправляемый код, чтобы у меня не было этой проблемы, и я мог работать непосредственно из 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 ?); Похоже, что он будет получать доступ только к методам из неуправляемого IInterface, а не к Wrapper^ из оболочки CInterface. Сбой происходит при попытке оценить mParent->Parse. Gcroot создает исключение GCHandle AppDomain. ?

Что я должен делать ??

Спасибо !


person Jazz.    schedule 24.11.2010    source источник


Ответы (1)


Честно говоря, было бы проще просто использовать ваше консольное приложение, чтобы делать все, что касается взаимодействия с USB, а затем просто заставить LabVIEW связываться с приложением через TCP (просто потому, что оно встроено и относительно просто в использовании по сравнению с некоторыми из другие методы).

person CookieOfFortune    schedule 24.11.2010
comment
Как я могу обмениваться данными из Labview с ConsoleApp с помощью TCP во время работы VI? Я гуглил, но не нашел ответа? :/ - person Jazz.; 25.11.2010
comment
Вы просто открываете TCP-порт в LabVIEW и подключаетесь к этому порту через консольное приложение. Вот ссылка на основные операции TCP: zone.ni.com/devzone/ cda/tut/p/id/2710 не стесняйтесь спрашивать меня, если у вас есть другие вопросы. - person CookieOfFortune; 14.12.2010