Передача дескриптора в консольное приложение ИЛИ управляемая / неуправляемая справка - PullRequest
1 голос
/ 24 ноября 2010

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

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

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

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

Есть ли способ, которым я мог бы передать ConsoleApp открытую ссылку на устройство (Handle, 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.Затем в оболочке mParent пуст (значение = ноль?);Похоже на то, что он будет обращаться только к методам из неуправляемого интерфейса II, а не к обертке ^ из оболочки CInterface.Сбой происходит при попытке оценить mParent-> Parse.Gcroot генерирует исключение GCHandle AppDomain.?

Что мне делать ??

Спасибо!

1 Ответ

0 голосов
/ 25 ноября 2010

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

...