2010-04-28 15 views
6

me gustaría llamar a este método en la biblioteca no administrado:Cómo calcular el int * en C#?

void __stdcall GetConstraints(

    unsigned int* puiMaxWidth, 

    unsigned int* puiMaxHeight, 

    unsigned int* puiMaxBoxes 

); 

Mi solución:

  • definición Delegado:

    [UnmanagedFunctionPointer (CallingConvention.StdCall)] delegado privada GetConstraintsDel vacíos (UIntPtr puiMaxWidth, UIntPtr puiMaxHeight, UIntPtr puiMaxBoxes);

  • La llamada del método:

    // 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); 
    } 
    

funciona, pero tengo que permitir que la bandera de "inseguro". ¿Hay una solución sin código inseguro? ¿O esta solución está bien? No entiendo muy bien las implicaciones de configurar el proyecto con una marca insegura.

¡Gracias por la ayuda!

+0

creo que debería funcionar como lo es (menos la dirección de los operadores) y sin el bloque insegura ... –

+0

No funciona. El constructor de UIntPtr toma como parámetro la dirección del puntero. –

Respuesta

4

¿Acaba de salir?

es decir:

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

funciona bien con:

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

Muestra de uso;

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

Nota: este es el código de trabajo real –

+0

¡Gracias, funciona! –