IMetaDataImport2::EnumGenericParams Метод не работает

После решения одной проблемы с 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);

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

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

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

1 ответ

Решение

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

Другие вопросы по тегам