我在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);
,这是呼吁初始化:
string filePath = Application.StartupPath + "\\ABC.ini";
Version version = new Version();
result = _mydllWrapper.Init(ref version, filePath);
为所有上面的代码,当我运行的C#应用程序,我有时s在x64机器中获得以下例外:
Unable to load DLL mydll.dll : invalid access to memory location (Exception from HRESULT.0x800703E6)
如何修复此代码而不从编译中删除任何安全标志? 解决方案的代码示例非常好!
谢谢!
尝试删除C#版本中的“{get; set;}”,因为这些子句实际上会将主要/次要转换为特性,而不是字段。此外,我不确定是否可以依靠C++版本和C#版本具有完全相同的内存布局,因为短于机器字。你有没有尝试只初始化Init内的版本,而没有做其他事情(仅用于调试目的)? – chris