2012-01-19 18 views
0

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に移行したときに問題が発生しました。

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

+0

アプリを.NET 3.5(ClientProfile)に戻しても、メソッドは引き続きAccessViolationExpcetionをスローしますが、catchステートメントでキャッチできます。 – Paulie

+0

最初の呼び出しの前にpEnumをIntPtr.Zeroに設定しましたか? pEnumをCloseEnumに渡して(フィールドを再利用する予定がある場合)、再度ゼロを設定する必要があります。 EnumGenericParamsは、最初の呼び出しから後続の呼び出しへのフィールドパス状態を使用します。また、C#コードで使用しているmdTokenの定義は何ですか? 4バイトの値型でない場合は、問題が発生する可能性があります。 –

答えて

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の下でなければなりません(またはおそらく低い)。

+0

アクセス違反は、プロセスが想定されていない仮想アドレスにアクセスしようとしたときに発生し、セキュリティ上のエラーではなくコーディングエラーを示します(より一般的なNullReferenceExceptionのように考える)。間違ったセキュリティ権がそれを引き起こしたら、私は心配しています。私は、権利を変更することでエラーが起こりにくくなるほど環境が変わった可能性が高いと思います。 –

関連する問題