托管可扩展性框架(MEF)和托管AddIn框架(MAF,又名System.AddIn)似乎完成了非常类似的任务.根据这个Stack Overflow问题,MEF是System.Addin的替代品吗?,你甚至可以同时使用两者.
你什么时候选择使用一个与另一个?在什么情况下你会选择同时使用它们?
示例控制台程序.
class Program
{
static void Main(string[] args)
{
// ... code to build dll ... not written yet ...
Assembly assembly = Assembly.LoadFile(@"C:\dyn.dll");
// don't know what or how to cast here
// looking for a better way to do next 3 lines
IRunnable r = assembly.CreateInstance("TestRunner");
if (r == null) throw new Exception("broke");
r.Run();
}
}
Run Code Online (Sandbox Code Playgroud)
我想动态构建一个程序集(.dll),然后加载程序集,实例化一个类,并调用该类的Run()方法.我应该尝试将TestRunner类转换为某些东西吗?不确定一个程序集中的类型(动态代码)如何知道我的(静态程序集/ shell应用程序)中的类型.使用几行反射代码只在一个对象上调用Run()会更好吗?该代码应该是什么样的?
更新:威廉埃德蒙森 - 见评论
允许和实现应用程序的插件系统的标准方法是什么?
在我的上一个应用程序中,我为他们必须实现的所有插件创建了一个简单的界面.然后我在apps目录中加载所有程序集,并抛弃任何不实现该接口的程序集.
接口中的一个方法是DoWork()方法,该方法定期在所有已加载的程序集上调用,以执行插件可能具有的任何操作.
什么是"适当"的插件系统方式?你刚刚为插件创建了一个接口吗?你应该定期在所有插件中调用特定方法吗?有更复杂的方式吗?
编辑:
感谢Matt Hamilton对System.Addin命名空间的引用.这很可能是我实现插件的方式.但是,我仍然对插件体系结构一般感到好奇,并且不介意一些关于它们应该被设计的最佳方式的背景知识,以及如何在加载后如何调用它们等等.
Managed Extensibility Framework是System.Addin的替代品吗?或者它们是互补的吗?
我读了这篇文章如何在.NET中加载插件?,我真的没有看到微软的System.Addin命名空间的光彩.为什么我不能在我的bin目录中有一个plugins文件夹,用户可以将程序集放入实现我设计的接口?然后我可以使用反射来创建插件类的实例并使用我的界面引用它.
为什么System.Addin显然要好得多?特别是因为它似乎是工作的三倍和不太直观的设计.
我想得到一些建议.我正在开发一个系统,它将在运行时加载插件并要求它们通过WCF端点可用.
我将有一个仅用于配置的MVC 3 Web应用程序,以及一个将加载不同插件的类库(核心).
我会很感激如何解决这个问题.我想加载插件,然后能够创建一个在IIS 7中注册的WCF端点,以访问该插件.
提前致谢 :)
我正在用C#编写一个Addin框架,我想知道如何在不需要重新启动应用程序的情况下使Addin无法加载.
我听说过AppDomains但这些有用吗?Addin可以添加可扩展性类,并且可以通过接口在主AppDomain中调用,并且仍然可以卸载并调用清理代码,导致这些类被删除而该程序集不在主AppDomain中吗?
或者是否有其他方法可以实现无法加载的插件,但是除了AppDomain之外的IIRC,你无法卸载组件.
如果可能的话,我还希望插件引擎与Mono兼容,所以如果可以的话,任何答案都会尝试与Mono保持兼容.
我目前有一个DLL(使用C++完成).现在我想在我的C#应用程序中加载此DLL以访问某些方法.
我尝试使用此处显示的示例,但它无法工作: 我可以在运行时加载.NET程序集并实例化只知道名称的类型吗?
知道什么是错的吗?有没有办法加载DLL并访问方法?
在此先感谢,Perumal
.net ×6
c# ×5
plugins ×4
mef ×3
add-in ×2
inheritance ×1
maf ×1
mono ×1
reflection ×1
system.addin ×1
wcf ×1