我尝试在我的项目中使用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/