4

我在 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)

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

谢谢!

4

1 回答 1

1

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

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

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

于 2013-01-07T06:13:51.013 回答