繁体   English   中英

无效访问内存位置 - 管理到非托管代码

[英]invalid access to memory location - managed to unmanaged code

我在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;
}

我从c#调用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);

对于以上所有代码,当我运行c#应用程序时,我有时会在x64机器中遇到以下异常:

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

如何在不从编译中删除任何安全标志的情况下修复此代码? 修复的代码示例真的很棒!

谢谢!

不幸的是,问题是遗漏了一些信息,但是当你的构建输出不正确时我才会看到这个错误。 它只会“偶尔”发生,因为您可能偶尔会删除.Net exe的输出目录,然后进行构建,然后在出现问题后,从本机输出目录复制新构建的二进制文件,然后继续。

要解决此问题,您应确保在.NET代码和本机代码之间具有正确匹配的目标CPU类型。 如果你只在x64机器上运行,你可以只使用AnyCPU,但我建议,因为你正在调用本机代码,你只需要将CPU设置为你的目标,无论是x64,x86(用C ++表示的Win32)或ARM。 另一个适用于VS2012的替代方案是“32位首选”目标,它允许您在x64设备上以x86身份运行,但也可以在ARM设备上正常运行。

无论如何,一旦确保配置正确,请检查以确保正确设置输出目录以将.NET exe和C ++ dll放入同一输出目录中。 请注意,输出目录特定于每个构建/体系结构组合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM