对内存位置的访问无效-托管到非托管代码
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都放入同一个输出目录。注意,输出目录是特定于每个构建/架构组合的。
相关文章:
- 如何在 c++ 非托管代码中反序列化 byte[] 的 json 字符串?
- 如何使用指针直接从托管代码中的非托管代码中读取矢量数据
- 异步接口托管 - > 非托管代码
- 从C++(非托管代码)检索数组到 C 尖锐形式(托管)
- 将C++非托管代码转换为 C#
- 将托管事件处理程序传递给 Linux 中的非托管代码
- 使用 P/Invoke 时存储非托管代码的数据
- Windows 服务导入C++非托管代码
- P/从获取"tried to access protected memory error"调用非托管C++代码
- 将数据从非托管代码传递到托管代码
- 从 VB.NET 调用非托管代码C++ dll
- 当C#中的字节数组传递给结构中的非托管代码时,会发生什么情况
- 在托管代码和非托管代码之间传递非托管结构的安全数组
- 如何调试C++非托管代码中的较低级别文件访问异常/崩溃
- 自定义Direct2D呈现托管代码和非托管代码之间的批封送处理
- winform中的C++非托管代码
- 如何减少 Visual Studio 非托管代码中的发布生成时间
- 让非托管 C++ 代码调用调用 C# 代码的托管 C++ 代码
- 需要从非托管c++代码中调用托管代码
- 对内存位置的访问无效-托管到非托管代码