Недействительный доступ к ячейке памяти - управляется неуправляемым кодом

98
14

У меня есть этот код в С++, который я экспортировал с помощью dll:


typedef struct {
unsigned short major;
unsigned short minor;
} Version;

EXPORTED_FUNC Result Init(Version *version, char *file);

extern "C" Result Init(Version *version, char *file)
{
if (file) {
if (!GFile.init(string(file))) {
return INVALID_PARAMETER;
}
if (version) {
version->major = VERSION_MAJOR1;
version->minor = VERSION_MAJOR2;
}

return OK;
}


Я вызываю dll из С#, и вот что я там написал:


internal struct Version
{
ushort major { set; get; }
ushort minor { set; get; }
}

[DllImport("mydll.dll", CallingConvention=CallingConvention.Cdecl)]
static extern Result Init(ref Version versionInfo, [MarshalAs`(UnmanagedType.LPStr)] string FilePath);


и это вызов Init:


string filePath = Application.StartupPath + "\\ABC.ini";
Version version = new Version();

result = _mydllWrapper.Init(ref version, filePath);


для всего вышеприведенного кода, когда я запускаю приложение С#, я иногда получаю на машинах x64 следующее исключение:


Unable to load DLL mydll.dll : invalid access to memory location (Exception from HRESULT.0x800703E6)

Как я могу исправить этот код БЕЗ удаления каких-либо флагов безопасности из компиляции?
образец кода для исправления действительно хорош!


спасибо!

спросил(а) 2012-12-24T11:39:00+04:00 8 лет, 3 месяца назад
1
Решение
76

Вопрос, к сожалению, не хватает какой-либо информации, но я видел эту ошибку только при неправильном выходе сборки. Это случается только "изредка", потому что иногда вы можете удалить выходной каталог для .Net exe, а затем выполнить сборку, а затем, после возникновения проблемы, вы скопируете недавно созданный двоичный файл из собственного выходного каталога и затем перейдете к нему.


Чтобы решить эту проблему, вы должны убедиться, что у вас правильно сопоставлены целевые типы процессоров между вашим кодом .NET и вашим собственным кодом. Если вы работаете только на машине x64, вы можете просто использовать AnyCPU, но я бы рекомендовал, поскольку вы вызываете собственный код, который вы просто запускаете и устанавливаете CPU в свою цель, будь то x64, x86 ( Win32 на языке С++) или ARM. Еще одна альтернатива, которая работает с VS2012, - это "32-битная предпочтительная" цель, которая позволяет вам запускать как x86 на устройстве x64, но также отлично работает на устройстве ARM.

В любом случае, как только вы убедитесь, что ваши конфигурации верны, убедитесь, что ваши выходные каталоги настроены правильно, чтобы удалить .NET exe и dll С++ в один и тот же выходной каталог. Обратите внимание, что каталоги вывода специфичны для каждой комбинации сборки/архитектуры.

ответил(а) 2013-01-07T09:13:00+04:00 8 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема