0

IMetaDataImportで1つの問題を解決した後、私はかなり長い間別の問題に取り組んでいます。EnumGenericParamsメソッドを使用します。

このメソッドはAccessViolationExpcetionをスローしますが、これはたまにしか発生しません。その他の場合、メソッドは問題なく呼び出しから戻りますが、そのパラメーターは、expcetionをスローするときのパラメーターと同じです。たまにしか理由がわかりません。

また、AccessViolationExpcetionはcatchステートメントでキャッチできません。VS 2010でデバッグする場合、例外TargetInvocationExceptionは、AccessViolationExpcetionに設定されたInnerExceptionで最初にキャッチされます。

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

(3番目のパラメーターがnullではなく、4番目のパラメーターが0より大きい場合でも、例外が発生します。)

この問題は、アプリを.NET3.5から.NET4に移動したときに発生しました。

助けてくれてありがとう!

4

1 に答える 1

0

Uff(2回目:-))、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 に答える