У меня есть этот код в 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)
Как я могу исправить этот код БЕЗ удаления каких-либо флагов безопасности из компиляции?
Пример кода для исправления действительно приветствуется!
Спасибо!
Вопрос, к сожалению, в том, что не хватает некоторой информации, но я видел эту ошибку, только если у вас неверные результаты сборки. Это может произойти только «изредка», потому что вы можете время от времени удалять выходной каталог для .Net exe, затем делать сборку, а затем, после возникновения проблемы, копировать только что созданный двоичный файл из собственного выходного каталога и затем двигаться дальше.
Чтобы решить эту проблему, вы должны убедиться, что у вас есть правильно подобранные целевые типы CPU между вашим .NET кодом & твой родной код. Если вы работаете только на компьютере с архитектурой x64, вы можете просто использовать AnyCPU, но я бы порекомендовал, так как вы вызываете нативный код, что вы просто идете вперед & установите CPU на свою цель, будь то x64, x86 (на языке Win32 в C ++) или ARM. Еще одна альтернатива, которая работает с VS2012, — это «32-разрядная предпочтительная» цель, которая позволяет вам работать под управлением x86 на устройстве x64, но также будет отлично работать на устройстве ARM.
В любом случае, после того, как вы убедились, что ваши конфигурации верны, убедитесь, что ваши выходные каталоги настроены правильно, чтобы сбросить как .NET exe, так и DLL C ++ в один и тот же выходной каталог. Обратите внимание, что выходные каталоги являются специфическими для каждой комбинации сборки / архитектуры.
Других решений пока нет …