IMetaDataImport2::EnumGenericParams方法没有';不起作用

本文关键字:不起作用 EnumGenericParams 方法 IMetaDataImport2 | 更新日期: 2023-09-27 18:20:59

在解决了IMetaDataImport的一个问题后,我要处理另一个问题相当长的时间。它使用EnumGenericParams方法。

该方法抛出AccessViolationExpcetion,但这种情况仅在时发生。在其他情况下,该方法从调用返回时没有任何问题,但其参数与抛出表达式时的参数相同。我不知道为什么,只是有时候。

此外,AccessViolationExpcetion不能被catch语句捕获。在VS 2010中调试时,首先捕获异常TargetInvocationException,InnerException设置为AccessViolationExpcetion。

IMetaDataImport2和EnumGenericParams:的定义

[ComImport]
[Guid("<valid GUID>")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[CLSCompliant(false)]
public interface IMetaDataImport2 : IMetaDataImport {
....
    void EnumGenericParams(
     [ComAliasName("HCORENUM*"), In, Out] ref IntPtr phEnum,
     [ComAliasName("mdToken")] mdToken tk,
     [ComAliasName("mdGenericParam*"), Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] mdToken[] rGenericParams,
     [ComAliasName("ULONG")] uint cGenericParams,
     [ComAliasName("ULONG*"), Out] out uint pcGenericParams
     );
    ....

方法调用:

metadataImport2.EnumGenericParams(ref pEnum, memberDef, null, 0, out genParamCount);

(即使调用第三个参数不为空,第四个参数>0也会导致异常。)

将应用程序从.NET 3.5移动到.NET 4时出现问题。

谢谢你的帮助!

IMetaDataImport2::EnumGenericParams方法没有';不起作用

Uff(第二次:-)),似乎将SecurityPermissions设置得足够高可以解决问题:

[SecurityPermission(SecurityAction.Demand, Flags = SecurityPermissionFlag.AllFlags)]
void EnumGenericParams(
  [ComAliasName("HCORENUM*"), In, Out] ref IntPtr phEnum,
  [ComAliasName("mdToken")] mdToken tk,
  [ComAliasName("mdGenericParam*"), Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex=3)] mdToken[] rGenericParams,
  [ComAliasName("ULONG")] uint cGenericParams,
  [ComAliasName("ULONG*"), Out] out uint pcGenericParams
  );

此外,具有IMetaDataInterface2的程序集应该低于.NET 3.5(或更低版本)。