one issue with IMetaDataImportを解決した後、私は非常に長い間別のものを扱っています。方法はEnumGenericParamsです。IMetaDataImport2 :: EnumGenericParamsメソッドが機能しません
このメソッドはAccessViolationExpcetionをスローしますが、これは時にはにしか発生しません。それ以外の場合、メソッドは問題なく呼び出して戻りますが、そのパラメータはexpcetionをスローするときのパラメータと同じです。私はなぜ時々だけ見つけることができません。
また、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
);
....
メソッド呼び出し:(。あっても例外にしないヌルと第> 0のリード第三のパラメータで呼び出す)
metadataImport2.EnumGenericParams(ref pEnum, memberDef, null, 0, out genParamCount);
アプリケーションを.NET 3.5から.NET 4に移行したときに問題が発生しました。
何か助けてくれてありがとう!
アプリを.NET 3.5(ClientProfile)に戻しても、メソッドは引き続きAccessViolationExpcetionをスローしますが、catchステートメントでキャッチできます。 – Paulie
最初の呼び出しの前にpEnumをIntPtr.Zeroに設定しましたか? pEnumをCloseEnumに渡して(フィールドを再利用する予定がある場合)、再度ゼロを設定する必要があります。 EnumGenericParamsは、最初の呼び出しから後続の呼び出しへのフィールドパス状態を使用します。また、C#コードで使用しているmdTokenの定義は何ですか? 4バイトの値型でない場合は、問題が発生する可能性があります。 –