0

在用 IMetaDataImport解决了一个问题后,我正在处理另一个问题很长一段时间。它使用EnumGenericParams方法。

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

此外,不能通过 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);

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

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

感谢您的任何帮助!

4

1 回答 1

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

于 2012-01-19T23:50:00.853 回答