|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Разработка ведётся в Windows 10 Prof 32bit в Visual Studio 2013. Есть тестовое WPF C# приложение, в котором на форме расположена всего одна кнопка. В решении в качестве подпроекта с именем TokenApi имеется С++ CLR DLL с одним методом Test(). В WPF приложении ссылка на С++ CLR DLL добавлена в Reference. При нажатии на кнопку в WPF приложении вызывается тестовый метод из DLL. В свойствах WPF C# приложения на вкладке "Build" в поле "Platform target" установлено значение "x86". В "Configuration Manager" в "Active solution platform" и у DLL стоит "Win32". У WPF приложения стоит "x86". При этом на 32 разрядной платформе всё работает, а на 64 разрядной возникает ошибка. Причём ошибка возникает на этапе создания класса, определённого в DLL, т. е. на строчке TokenApi.TokenApi tokenApi = new TokenApi.TokenApi() и не перехватывается блоком catch. В чём здесь дело? Вот сообщение об ошибке в Event Viewer: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Вот класс в C++ CLR DLL: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 15:43 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Degun, Вроде DLL не находит ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 16:55 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Cat2, А почему? На 32 разрядной платформе находит, а на 64 нет. Вроде бы я везде в проекте указал, что это 32 разрядное приложение и на 64 платформе вроде бы проблем не должно быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 17:02 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunА почему? К сожалению я не вхожу в пул разработчиков МС и не знаю почему. Попробуйте все скомпилировать под AnyCPU ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 17:59 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunА почему? проверьте расположение dll/exe - вполне возможно - не лежат они рядышком после билда ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 18:22 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Изопропил, Я проверяю следующим образом: запускаю программу из директории на 32 разрядной платформе. Все работает. Затем эту же директорию копирую на компьютер с 64 разрядной платформой. Удалённо захожу на тот компьютер и запускаю там - не работает. Почему не понятно. Как тогда делать 32 разрядные приложения с C++ CLR DLL, чтобы они работали и на 64 разрядных платформах? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 22:30 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunКак тогда делать 32 разрядные приложения с C++ CLR DLL, чтобы они работали и на 64 разрядных платформах? Cat2Попробуйте все скомпилировать под AnyCPU ... |
|||
:
Нравится:
Не нравится:
|
|||
18.10.2016, 23:05 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Cat2, При компиляции под AnyCPU также падает. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 00:07 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunЗатем эту же директорию копирую на компьютер с 64 разрядной платформой. Удалённо захожу на тот компьютер и запускаю там - не работает. А если копируете на 32, работает? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 08:01 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Degun, включите Fusion Log Viewer , запустите программу на x64, и посмотрите в логе, откуда процесс пытается загрузить вашу dll. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 09:14 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, На компьютере с 64-ой ОС, где проводится тестирование, Visual Studio не установлена. Поэтому запустить Fusion Log Viewer там я вроде как не могу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 11:42 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Cat2, Одна и та же программа на 32-х разрядной ОС работает, а на 64-х разрядной ОС нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 11:45 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunСон Веры Павловны, На компьютере с 64-ой ОС, где проводится тестирование, Visual Studio не установлена. Поэтому запустить Fusion Log Viewer там я вроде как не могу. Вполне можно. Из папки Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\x64\ копируете FUSLOGVW.exe и папку 1033 с файлом flogvwrc.dll. На компьютере с х64 запускаете FUSLOGVW.exe под администратором, конфигурируете расположение лога и прочие параметры, запускаете вашу программу, в окне FUSLOGVW жмете кнопку Refresh. Всё. Было проверено не раз на компьютерах, где VS отродясь не бывало. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 12:21 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныВполне можно. Из папки Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools\x64\ копируете FUSLOGVW.exe и папку 1033 с файлом flogvwrc.dll. На компьютере с х64 запускаете FUSLOGVW.exe под администратором, конфигурируете расположение лога и прочие параметры, запускаете вашу программу, в окне FUSLOGVW жмете кнопку Refresh. Всё. Было проверено не раз на компьютерах, где VS отродясь не бывало. Причина, как выяснилось, не в том, что программа не находит DLL. Стал грузить DLL динамически с точным указанием пути к библиотеке - ошибка загрузки осталась. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50.
Похоже на то, что в системе чего-то не хватает. Нашёл 64 разрядную машину, где всё работает нормально. Как узнать что нужно доставить в системе? PS: На всех машинах с 64 битной ОС, где проводится проверка и возникает ошибка, были установлены: Microsoft Visual C++ 2013 Redistributable (x64) — 12.0.30501 Microsoft Visual C++ 2013 Redistributable (x86) — 12.0.30501 ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 13:20 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunПричина, как выяснилось, не в том, что программа не находит DLL. Может, в библиотеке все-таки не просто класс с одним методом? FileNotFoundException - managed-исключение, и возникает только при загрузке managed-библиотек (при пинвоках к несуществующим библиотекам вместо FileNotFoundException выбрасывается System.DllNotFoundException: Исключение из HRESULT: 0x8007007E - что-то типа такого), так что не смотрите в сторону unmanaged-билиотек, у вас затык в managed. И да, что же показал FUSLOGVW? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 14:08 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныИ да, что же показал FUSLOGVW? Вот по поводу загрузки библиотеки TokenApi64.dll Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 15:29 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
DegunСон Веры ПавловныИ да, что же показал FUSLOGVW? Вот по поводу загрузки библиотеки TokenApi64.dll Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
http://stackoverflow.com/questions/28252484/fusion-log-assembly-binder-error-bind-result-hr-0x1-incorrect-function : The actual error code is S_FALSE, a COM error code that means "it successfully failed". Which is why it says The operation was successful . Misinterpreted for the diagnostic message as "Function failed", that's the description for Windows error 1 and returned by the FormatMessage() winapi function. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.10.2016, 15:50 |
|
Ошибка вызова из C# приложения метода из C++ CLR DLL
|
|||
---|---|---|---|
#18+
Оказалось, что дело было в том, что я проверял debug-версию, а для её работы требуются дебажные библиотеки msvcp120d.dll, msvcr120d.dll и др. Поэтому на машинах где не стояла Visual Studio происходила ошибка, т. к. этих библиотек в системе не было, а где была VS - ошибки не было. У release-версии таких проблем нет. Спасибо вопрос закрыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.10.2016, 22:06 |
|
|
start [/forum/topic.php?fid=20&fpage=53&tid=1400278]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 268ms |
total: | 410ms |
0 / 0 |