IMetaDataImport2 :: EnumGenericParams Метод не работает - PullRequest
0 голосов
/ 19 января 2012

После решения одной проблемы с IMetaDataImport я имею дело с другим довольно долго. Это с EnumGenericParams метод.

Метод выдает AccessViolationExpcetion, но это происходит только иногда . В других случаях метод возвращается из вызова без каких-либо проблем, но его параметры совпадают с параметрами, когда он вызывает исключение. Я не могу понять, почему только иногда.

Кроме того, 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
     );
    ....

Метод, вызывающий:

metadataImport2.EnumGenericParams(ref pEnum, memberDef, null, 0, out genParamCount);

(Даже вызов с третьим параметром, отличным от NULL, а четвертый> 0 приводит к исключению.)

Проблема возникла, когда я переместил приложение из .NET 3.5 в .NET 4.

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 20 января 2012

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 (или, возможно, ниже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...