2010-04-28 3 views
6

Я хотел бы назвать этот метод в неуправляемой библиотеке:Как перевести int * в C#?

void __stdcall GetConstraints(

    unsigned int* puiMaxWidth, 

    unsigned int* puiMaxHeight, 

    unsigned int* puiMaxBoxes 

); 

Моим решения:

  • определение делегата:

    [UnmanagedFunctionPointer (CallingConvention.StdCall)] частного делегат недействительного GetConstraintsDel (UIntPtr puiMaxWidth, UIntPtr puiMaxHeight, UIntPtr puiMaxBoxes);

  • Вызов метода:

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

Это работает, но я должен позволить "небезопасный" флаг. Есть ли решение без небезопасного кода? Или это решение нормально? Я не совсем понимаю последствия установки проекта с помощью небезопасного флага.

Спасибо за помощь!

+0

Я считаю, что он должен работать, как это (минус адрес операторов) без небезопасного блока ... –

+0

Это не работает. Конструктор UIntPtr принимает в качестве параметра адрес указателя. –

ответ

4

Just out uint?

т.е.

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

отлично работает с:

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

Пример использования;

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

Примечание: это действительный рабочий код –

+0

Спасибо, он работает! –

Смежные вопросы