2010-04-28 57 views
6

我想調用這個方法在非託管庫:如何在C#中編組int *?

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

我相信它應該像沒有不安全塊一樣工作(減去運營商的地址)... – 2010-04-28 21:08:30

+0

它不起作用。 UIntPtr的構造函數將指針地址作爲參數。 – 2010-04-28 21:23:39

回答

4

剛出局?

即:

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

注意:這是實際工作代碼 – 2010-04-29 00:09:54

+0

謝謝,它的工作原理! – 2010-04-29 07:53:43