У меня есть элемент управления 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# может проверить, что я сделал этот перевод правильно или неправильно, это может помочь.
Я так считаю. Вы имеете в виду проверку флажка в проекте ** Свойства> Сборка> Регистрация для COM-взаимодействия **? – blastthisinferno