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