2010-04-28 20 views
6

मैं अप्रबंधित पुस्तकालय में इस विधि कॉल करना चाहते हैं:सी # में मार्शल 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

मेरा मानना ​​है कि के रूप में यह (ऋण का पता-के संचालकों) असुरक्षित ब्लॉक के बिना ... –

+0

यह काम नहीं करता है यह काम करना चाहिए। UIntPtr का कन्स्ट्रक्टर पॉइंटर पता पैरामीटर के रूप में लेता है। –

उत्तर

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

नोट: यह वास्तविक कार्य कोड –

+0

धन्यवाद है, यह काम करता है! –

संबंधित मुद्दे