ReflectionTypeLoadException, DllImport и универсальный класс - PullRequest
2 голосов
/ 12 марта 2012

Я пытаюсь использовать MEF в своем проекте, но в некоторых случаях я получаю эту ошибку:

System.Reflection.ReflectionTypeLoadException

Невозможно загрузить один или несколько запрошенных типов.Извлеките свойство LoaderExceptions для получения дополнительной информации.

Универсальный метод или метод в универсальном классе - это внутренний вызов, PInvoke или определен в классе импорта COM.

В исключении журнала он представляет собой универсальный класскоторые используют атрибут DllImport.

Разве невозможно вызвать методы pinvoke в универсальном классе?

Мне все еще интересно, почему это вызывает проблему.

исходный код:

void Compose()
        {
            try
            {
                DirectoryCatalog catalog =
                    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory);

                AggregateCatalog agcatalogue = new AggregateCatalog(new ComposablePartCatalog[] {catalog, 
                    new AssemblyCatalog(Assembly.GetExecutingAssembly())});

                CompositionContainer container = new CompositionContainer(agcatalogue);

                CompositionBatch batch = new CompositionBatch();

                batch.AddPart(this);

                container.Compose(batch);
            }
            catch (FileNotFoundException fnfex)
            {
                Console.WriteLine(fnfex.Message);
            }
            catch (CompositionException cex)
            {
                Console.WriteLine(cex.Message);
            }
            catch (System.Reflection.ReflectionTypeLoadException rte)
            {
                Console.WriteLine(rte.Message);
                foreach (Exception ex in rte.LoaderExceptions)
                {
                    Console.WriteLine(ex.ToString());
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }


//Generic Class
 [Serializable]
    public class ProcessCounters<T> : IDisposable where T : ICounterData
    {

        /// <summary>
        /// Extern
        /// </summary>
        /// <param name="ticks"></param>
        [DllImport("Kernel32.dll")]
        public static extern void QueryPerformanceCounter(ref long ticks);

        private static T _counterData;

...}

Обновление: Ограничение: Вы не можете иметь DllImports в универсальном классе.Поместите ваши DllImports в отдельный статический класс (как рекомендуется).Решение. Решите его, переместив класс NativeMethods за пределы универсального класса.

http://blog.appelgren.org/2006/05/04/nested-class-with-pinvoke-in-generic-class/

http://www.archivum.info/microsoft.public.dotnet.framework.clr/2006-12/00015/RE-TypeLoadException-when-instantiating-generic-class-that-uses-D.html

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