2010-10-26 4 views
2

У меня есть элемент управления ActiveX, написанный на C# и работающий при запуске в программе, совместимой с ActiveX (CoDeSys). Проблема я столкнулся в том, что для того, чтобы позволить CoDeSys взаимодействовать с элементом управления ActiveX, CoDeSys требует DLL экспортировать прототип функции:Определение функции extern «C» в C#

void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag); 

Я смотрел без успеха о том, как экспортировать это как вы можете в C++, как показано в следующем примере:

extern "C" __declspec (dllexport) void ExecuteActiveXCall(IUnknown* pUnk, char* pszId, char* pszParam, char* pszReturnBuffer, int nReturnBufferSize, DWORD* pdwReturnFlag) 
{ 
    if (strcmp(pszId, "IWebBrowser|GoBack") == 0) 
    { 
    IUnknown* pNewUnk; 
    IWebBrowser* pwb; 
    pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk); 
    pwb = (IWebBrowser*) pNewUnk; 

    if (pwb) 
    { 
     pwb->GoBack(); 
     pwb->Release(); 
    } 
    } 
    else if (strcmp(pszId, "IWebBrowser|GoForward") == 0) 
    { 
    IUnknown* pNewUnk; 
    IWebBrowser* pwb; 
    pUnk->QueryInterface(IID_IWebBrowser, (void**) &pNewUnk); 
    pwb = (IWebBrowser*) pNewUnk; 

    if (pwb) 
    { 
     pwb->GoForward(); 
     pwb->Release(); 
    } 
    } 
} 

C# не имеет Экстерн ключевое слово, но это не позволяет обеспечить определение функции (по крайней мере, я не нашел способ) , После попытки этого:

extern unsafe void ExecuteActiveXCall(
     [MarshalAs(UnmanagedType.IUnknown)] object pUnk, 
     char* pszId, 
     char* pszParam, 
     char* pszReturnBuffer, 
     int nReturnBufferSize, 
     UInt32* pdwReturnFlag) 
    { 

    } 

Следующая ошибка:

'AlarmsCSharp.AlarmsControl.ExecuteActiveXCall(object, char*, char*, char*, int, uint*)' cannot be extern and declare a body 

Кто-нибудь пытался экспортировать функцию в DLL C#?

Есть ли способы обхода? (У меня была мысль о [DllImport («AlarmsCSharp.dll»)] и вызов C# в C++ DLL, но полагал, что я хотел бы видеть, если кто-нибудь было решение раньше)

Возможно, я над этим думать и не нужно экспортировать эту функцию, поскольку элемент управления ActiveX может взаимодействовать уже с кодом C#.

EDIT: У меня есть ощущение моего перевода из прототипа функции C++ в декларацию интерфейса C#. Если кто-то с большим опытом работы с программированием на C++/C# может проверить, что я сделал этот перевод правильно или неправильно, это может помочь.

ответ

0

Вы говорите, что CoDeSys совместим с ActiveX; вы пытались использовать COM-взаимодействие?

+0

Я так считаю. Вы имеете в виду проверку флажка в проекте ** Свойства> Сборка> Регистрация для COM-взаимодействия **? – blastthisinferno

0

Существует, по-видимому, 3 основных варианта; во-первых, настроить COM-взаимодействие, где вы можете создать экземпляр вашего элемента управления C# с помощью COM. Я уверен, что если вы выполните некоторые поиски, вы сможете найти дополнительную информацию об этом.

Второй вариант, чтобы сделать ваш модуль C++ смешали регулировались/неуправляемый, как описано здесь: http://social.msdn.microsoft.com/Forums/en-US/vclanguage/thread/5345a27a-a614-4a74-9f6d-ea7a999ddf83/

Третий вариант заключается в использовании «обратного PInvoke», как описано здесь: http://tigerang.blogspot.com/2008/09/reverse-pinvoke.html

Там может быть другие варианты; это те, о которых я знаю.