2010-04-28 14 views
6

Ich möchte diese Methode in nicht verwalteten Bibliothek nennen:Wie marschiere ich int * in C#?

void __stdcall GetConstraints(

    unsigned int* puiMaxWidth, 

    unsigned int* puiMaxHeight, 

    unsigned int* puiMaxBoxes 

); 

Meine Lösung:

  • Delegate Definition:

    [UnmanagedFunctionPointer (CallingConvention.StdCall)] privaten delegate void GetConstraintsDel (UIntPtr puiMaxWidth, UIntPtr puiMaxHeight, UIntPtr puiMaxBoxes);

  • Der Aufruf der Methode:

    // PLUGIN NAME 
    GetConstraintsDel getConstraints = (GetConstraintsDel)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall, typeof(GetConstraintsDel)); 
    
    uint maxWidth, maxHeight, maxBoxes; 
    
    unsafe 
    { 
        UIntPtr a = new UIntPtr(&maxWidth); 
        UIntPtr b = new UIntPtr(&maxHeight); 
        UIntPtr c = new UIntPtr(&maxBoxes); 
        getConstraints(a, b, c); 
    } 
    

Es funktioniert, aber ich muss "unsicher" Flag ermöglichen. Gibt es eine Lösung ohne unsicheren Code? Oder ist diese Lösung in Ordnung? Ich verstehe die Auswirkungen der Einstellung des Projekts mit unsicherer Flagge nicht ganz.

Vielen Dank für Ihre Hilfe!

+0

Ich glaube, es sollte funktionieren, wie es ist (minus die adress von Operatoren) ohne den unsicheren Block ... –

+0

Es funktioniert nicht. Der Konstruktor von UIntPtr übernimmt als Parameter die Zeigeradresse. –

Antwort

4

Nur gerade nicht?

dh:

HRESULT GetTypeDefProps (
    [in] mdTypeDef td, 
    [out] LPWSTR  szTypeDef, 
    [in] ULONG  cchTypeDef, 
    [out] ULONG  *pchTypeDef, 
    [out] DWORD  *pdwTypeDefFlags, 
    [out] mdToken  *ptkExtends 
); 

funktioniert mit:

uint GetTypeDefProps 
(
    uint td, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)]char[] szTypeDef, 
    uint cchTypeDef, 
    out uint pchTypeDef, 
    out uint pdwTypeDefFlags, 
    out uint ptknds 
); 

Probe Gebrauch;

char[] SzTypeDef; 
uint CchTypeDef; 
uint PchMember; 
IntPtr PpvSigBlob; 
uint PbSigBlob; 

    SzTypeDef= new char[500]; 
    CchTypeDef= (uint)SzTypeDef.Length; 

ResPT= 
    MetaDataImport.GetTypeDefProps 
    (
    td, 
    SzTypeDef, 
    CchTypeDef, 
    out pchTypeDef, 
    out pdwTypeDefFlags, 
    out ptkExtends 
); 
+0

Hinweis: Dies ist tatsächlich Arbeitscode –

+0

Danke, es funktioniert! –