2015-02-12 18 views
6

BenPInvoke

MyFunction(IntPtr x); 

işlevsel ve

struct MyStruct { IntPtr P; } 

MyFunction(MyStruct x); 
teknik olarak benzer burası mı olabilir

Myfunction(const void * x); 

Benim C# beyanı adında bir fonksiyonu var düşünün

Ya da nasıl sıralandıklarına göre bir fark olacak.

Bunu söylüyorum çünkü kütüphaneyi aradım tüm boşluklar *, diğer isimlere yazdım, ve C# türünün güvenliğini almak istiyorum.

+1

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

+0

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. –

cevap

3

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.

+0

Deneme ve hata hiçbir şeyi kanıtlamaz. Başka bir örneğin farklı davranmadığını nereden biliyorsunuz? –

İlgili konular