[ad_1]
C++ から C# 構造への相互運用を試みています。
構造 c#
public static IntPtr tempNode = IntPtr.Zero;
また、要件に従って Marshal.PtrToStructure、Marshal.PtrToStringAuto を使用しています。
今私は64ビットコンパイルされたexeで試しています.C++からC#に共有されたアドレスは正しいですが、関数は
Marshal.PtrToStructure、Marshal.PtrToStringAuto は、構造内のデータをシフトし、ジャンク値を埋めています。
8 バイトのうち、4 バイトのみがコピー/修正されます。
私が試したこと:
ノードは私のコードの構造です
public struct NODE { public ulong ullSector; public ulong ullSize; unsafe public NODE* pNext; unsafe public NODE* pChild; unsafe public NODE* pParent; public uint dwID; public uint dwSelfNum; public uint dwParentNum; public IntPtr pwcName; //this variable belongs to WCHAR* in c++ public ushort wCT; public ushort wAT; public byte bStatus; public byte bMarked; public byte bNameLength; public byte bIsThisRAWFolderFile; public IntPtr Path; }
IntPtr tempNode = IntPtr.Zero; NODE _dynamicNode = (NODE)Marshal.PtrToStructure(tempNode, typeof(NODE));
これらが気に入った場合は、構造内のデータをシフトし、ジャンク値を埋めます。
8 バイトのうち、4 バイトのみがコピーされます
32 ビットで実行する場合、64 でこの問題が発生するだけで問題はありません。
解決策 1
次の例の注記を参照してください。 Marshal.PtrToStructure メソッド (System.Runtime.InteropServices) | Microsoft Docs[^] 64ビットについて。
解決策 3
問題は少しあいまいです、ごめんなさい。 ただし、CharSet 属性 (auto) を設定しても、機能しているようには聞こえません。 Marshal.SystemDefaultCharSize (2 の場合は Unicode、それ以外の場合は Ascii) を確認し、属性で CharSet=Unicode を試すか、CharSet=Ascii を試してください。
また、構造体のレイアウトに問題があるか、レイアウトが指定されていない可能性があります。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
構造体 MyStruct
{}
リンク: StructLayoutAttribute クラス (System.Runtime.InteropServices) | マイクロソフト ラーン[^]
[ad_2]
コメント