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