我想在非托管库中调用此方法:

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



它有效,但我必须允许“不安全”标志。有没有不安全代码的解决方案吗?还是这个解决方案可以吗?我不太了解将项目设置为unsafe标志的含义。

感谢帮助!

最佳答案

刚出来吗?

即:

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

08-04 00:29