Я потратил несколько часов на поиски ответа, поэтому понял, что, если я спрошу себя, я, наконец, смогу найти решение своей проблемы. Сначала опишу, что я хочу сделать:
Итак, чтобы описать вышеописанный дизайн, у меня есть плагин .dll, написанный на чистом c ++ (я не хочу, чтобы он содержал какой-либо код .Net). Этот плагин c ++ будет использоваться с программной платформы. Теперь я хочу, чтобы служба c # windows взаимодействовала с программной платформой, но она может делать это только через c ++ dll. По этой причине я обернул всю функциональность плагина c ++ в Wrapped Dll (я экспортировал эту функциональность), и я использую Wrapped Dll в службе Windows c #.
Теперь у меня есть тестовый метод, чтобы проверить, работает ли экспорт функциональности c ++ нормально (просто простой метод, который возвращает сумму двух целых чисел), и я вижу, что служба windows может взаимодействовать с неуправляемой dll c ++ в правильный путь, я получаю правильные результаты. Проблема у меня возникает, когда я пытаюсь взаимодействовать с платформой программного обеспечения через неуправляемую dll c ++. Я получаю следующую ошибку:
Я понял, что ошибка должна быть в том, что неуправляемая dll не может быть доступна программной платформой и Wrapped Dll одновременно. Чтобы решить эту проблему, я обнаружил, что решение заключается в добавлении неуправляемой библиотеки DLL в GAC. Но чтобы поместить dll в GAC, dll должна иметь строгое имя, но я обнаружил, что не могу подписать строгое имя для неуправляемого кода, если у меня не включена опция / clr. Но когда у меня включена эта опция, неуправляемая DLL не компилируется.
Подводя итог, могу ли я как-нибудь получить доступ к моей неуправляемой dll через программную платформу и из обернутой dll? Без интеграции .Net в мой неуправляемый код?
Я потратил много часов на поиски решения, поэтому было бы здорово, если бы кто-нибудь из вас показал мне немного света в туннеле!
Спасибо
Ваши неуправляемые библиотеки DLL и все их зависимости должны находиться в той же папке, что и ваше приложение (.exe). Вам не нужен GAC. Если вы хотите хранить свои библиотеки в другом месте, просто используйте:
р (Invoke:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool AddDllDirectory(string lpPathName);
И при запуске вашего приложения:
if (System.Environment.OSVersion.Version.Major > 5)
{
AddDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}
else
{
SetDllDirectory(System.Windows.Forms.Application.StartupPath + "\\bin64");
}
Также убедитесь, что вы не перепутали архитектуру x86 и x64. Кроме того, убедитесь, что вы используете правильную CallingConvention. Хороший пример это: Необработанное исключение: System.AccessViolationException: попытка чтения или записи