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