У меня проблемы со сном из-за этого!У меня есть 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.?
Что мне делать ??
Спасибо!