Yapısal Düzeniniz Sıralı ise, o zaman aslında aynıdır.
public struct Foo
{
public IntPtr x;
}
[DllImport(@"Win32Project1.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern void MyFunctionWithIntPtr(IntPtr x);
[DllImport(@"Win32Project1.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl)]
public static extern void MyFunctionWithStruct(Foo x);
static void Main(string[] args)
{
IntPtr j = new IntPtr(10);
var s = new Foo();
s.x = new IntPtr(10);
MyFunctionWithIntPtr(j);
MyFunctionWithStruct(s);
}
:
extern "C"
{
__declspec(dllexport) void MyFunction(const void* ptr)
{
// put a breakpoint and inspect
}
}
bir C# projesi yapın: Bir C++ Win32 DLL proje olun
:
kendiniz için bu doğrulamak için
kolay yolu tabii ki, denemek için Hata ayıklama ayarlarınızda Yerel hata ayıklamayı etkinleştirdiğinizden emin olun.
Her iki değerin de 0xA olduğunu görürsünüz.
Ancak IntPtr vs Struct için dışarı/ref parametresi kullanırsanız, bunlar farklı değerler olacaktır.
Bu soru aşağıya doğru kaynatılır: Tek bir üyeli bir yapı, o üyenin türüyle aynı şekilde sıralanmış mıdır? Bilmem, ben * kesinlikle * şüphelenmiyorum. – BradleyDotNET
Doğrudan bir yanıt değil, ancak geçmişte her zaman "WhateverPtr" olarak adlandırılan "WhateverPtr" olarak adlandırılan IntPtr'i (tıpkı sizin önerdiğiniz gibi) tamamlayan yeni bir yapı yaptım ve ardından özel bir marşal kullanarak ICustomMarshaller arabirimi https://msdn.microsoft.com/en-us/library/d3cxf9f0(v=vs.90).aspx Ardından, IntPtr'lerinizi karıştırıp karıştıramazsınız. Ayrıca, daha fazla kendini belgeleyen bir şey de olsa, bir araya getirme kodunun bir kısmını çıkarmanız gerekiyor. Mareşalinin yaptıklarını sihirli bir şekilde tükürmesi veya kabul etmesi son derece olası görünmüyor. –