2011-01-10 48 views
1

有没有办法告诉MEF只有在满足某些其他依赖项dll /库时才会尝试加载dll?我试图编写一个依赖于另一个扩展的扩展。我希望能够检查是否存在其他扩展名,而不是仅尝试加载我的扩展名。它甚至有可能吗?我已经发现了如何检查某些DLL是否存在使用下面的代码(发现某处的StackOverflow):仅当某些外部库符合要求时,MEF才会导出/导入

 [DllImport("kernel32", SetLastError = true)] 
     static extern IntPtr LoadLibrary(string fileName); 
     static bool CheckLibrary(string fileName) 
     { 
      return LoadLibrary(fileName) != IntPtr.Zero; 
     } 

现在我希望能够只加载这些dll /扩展谁都有自己的依赖性满意。

+0

所以你说你写了一个依赖本机DLL的程序集,并且如果本机DLL丢失,你希望MEF忽略这个程序集? – 2011-01-12 13:13:02

回答

3

MEF通过拒绝自然地做到这一点。假设您希望分机A仅在分机B存在的情况下才能载入。推测这是因为扩展A取决于扩展B提供的某些功能。在MEF中表达这一点的方式是通过导入(基数为ExactlyOne,即不是集合导入并且不是可选)。

因此,扩展A应该有一个必需的导入,它可以通过从扩展B导出来满足。如果扩展B不存在,那么导入将不能被满足,并且扩展A将被拒绝,导致它在容器中不可用。

我在我的博客文章中解释了一点:How to Debug and Diagnose MEF Failures

+0

有趣!从来没有想过导入其他扩展。但是如果我无法控制我要使用的其他扩展程序呢?我的意思是说它不会自行导出,但只提供我想要订阅的服务(事件)。有没有办法处理这样的情况,我不能简单地'进口'? – ashokgelal 2011-01-11 04:36:28