c # — неверный доступ к ячейке памяти — управляемый неуправляемый код

У меня есть этот код в C ++, который я экспортировал с помощью 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 из C #, и это то, что я написал там:

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);

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

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

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

Спасибо!

4

Решение

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

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

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]