IMetaDataImport2 :: EnumGenericParams方法不起作用

时间:2012-01-19 14:59:30

标签: c# .net-4.0 imetadataimport

解决one issue with IMetaDataImport之后,我正在和另一个人打交道很长时间。它采用EnumGenericParams方法。

该方法抛出AccessViolationExpcetion,但这只发生有时。在其他情况下,该方法从调用返回没有任何问题,但其参数与抛出expcetion时的参数相同。我有时无法找到原因。

此外,catch语句无法捕获AccessViolationExpcetion。在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);

(即使使用第三个参数调用非空,第四个&gt; 0也会导致异常。)

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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

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下(或者可能更低)。