ReflectionTypeLoadException,DllImport和Generic类

时间:2012-03-12 14:42:37

标签: generics reflection pinvoke mef dllimport

我尝试在我的项目中使用MEF,但有些情况下我得到了这个错误:

System.Reflection.ReflectionTypeLoadException

无法加载一个或多个请求的类型。检索LoaderExceptions属性以获取更多信息。

泛型类中的泛型方法或方法是内部调用,PInvoke,或者在COM Import类中定义。

在日志异常中,它显示为使用DllImport attrib。

的泛型类

是不是可以在泛型类中调用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

0 个答案:

没有答案