Приложение C #, вызывающее 64-битную C / C ++ DLL, вылетает, но запускается 32-битная версия - PullRequest
0 голосов
/ 28 декабря 2018

Моя C / C ++ DLL создана для 32- и 64-битных сред Windows.Два программиста, работающих в .NET (C # и VB.NET), говорят, что когда они собирают своих клиентов для 32-битных систем, все работает правильно.Но когда они собираются для 64-битных систем, запуск заканчивается нарушением прав доступа.

Я не программист .NET, но я могу загрузить их процесс и пройти по коду DLL в отладчике C ++.Запуск .NET определенно сталкивается с поврежденной памятью, которая не возникает, когда клиент - тот, который я написал в C ++ / VCL.

Мой вопрос: есть ли что-то особенное в настройках проекта .NET для взаимодействия с 64-битная C / C ++ DLL, которая отличается от того, что работает под 32-битной ?

Возможно, уместно, но я не могу доказать это: DLL построена с Настройка символов = Не установлено для UTF-8 / ASCII.Я не знаю, построен ли клиент VB.NET для Unicode, но я предполагаю, что это может создать проблемы.

РЕДАКТИРОВАНИЕ ДЛЯ ДОБАВЛЕНИЯ объявлений от клиентов VB.NET, C # и C ++ DLL

Declare Function Edit_RunEdits Lib "EDITS50.DLL" (ByVal smfID As Integer, _
                                                  ByVal edit_set_tag As String, _
                                                  ByVal layout_tag As String, _
                                                  ByVal data As String, _
                                                  ByVal edit_options As Integer, _
                                                  ByRef errors_count As Integer, _
                                                  ByVal owner As IntPtr, _
                                                  ByVal callback_func As IntPtr) As Integer

Это объявление C #:

[DllImportAttribute("EDITS50.dll", EntryPoint = "Edit_RunEdits")]
    public static extern int Edit_RunEdits(int smfID, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string edit_set_tag, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string layout_tag, 
         [InAttribute()] [MarshalAsAttribute(UnmanagedType.LPStr)] string data, 
         int edit_options, 
         ref int errors_count, 
         System.IntPtr owner, 
         System.IntPtr callback_func);

Это сторона C ++:

#define EDIT_API  __declspec(dllexport) __stdcall
extern "C" int EDIT_API Edit_RunEdits( const int smfID, const char* edit_set_tag, 
const char* layout_tag, 
const char* data, 
const int edit_options, 
int* errors_count, 
void* owner, 
void* callback_func);

1 Ответ

0 голосов
/ 29 декабря 2018

Полагаю, я нашел проблему.Проект был построен для AnyCPU, но в настройках x64 настройка Prefer32Bit была "true".Я прошу .NET-программистов попытаться создать явно для x64, найти и переопределить все экземпляры Prefer32Bit (установите для них значение «false»).

Спасибо всем за ваш отзыв.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...