Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在.NET中是否有热交换的参考实现?_C#_.net_Mef_Hotswap - Fatal编程技术网

C# 在.NET中是否有热交换的参考实现?

C# 在.NET中是否有热交换的参考实现?,c#,.net,mef,hotswap,C#,.net,Mef,Hotswap,我正在寻找在.NET中完成的热交换的良好实现。我需要的是: 能够在特定文件夹中部署DLL,并让正在运行的系统接收它们 让运行的系统更新容器中相应的引用 我一直在研究MEF及其目录加载机制,但它似乎非常不可靠。可能有人有另一种实现?您可以通过调用下面的newAppDomain()为AssemblyResolve提供自定义事件处理程序。提供您的目录,以便AppDomain在那里查看。加载类型时,使用函数loadFromAppDomain()返回它。这应该允许您在运行时将新DLL复制到C:\DLL

我正在寻找在.NET中完成的热交换的良好实现。我需要的是:

  • 能够在特定文件夹中部署DLL,并让正在运行的系统接收它们
  • 让运行的系统更新容器中相应的引用

我一直在研究MEF及其目录加载机制,但它似乎非常不可靠。可能有人有另一种实现?

您可以通过调用下面的
newAppDomain()
AssemblyResolve
提供自定义事件处理程序。提供您的目录,以便
AppDomain
在那里查看。加载类型时,使用函数
loadFromAppDomain()
返回它。这应该允许您在运行时将新DLL复制到
C:\DLL
,然后从那里重新加载。(请原谅,我根据您的标签将此从VB源代码翻译成了C。)

String dllFolder=“C:\\dlls”;
public void newAppDomain()
{
AppDomain.CurrentDomain.AssemblyResolve+=新的ResolveEventHandler(AssemblyResolve);
}
专用静态程序集assemblyResolve(对象发送器、ResolveEventArgs args args){
字符串assemblyPath=Path.Combine(dllFolder,新的AssemblyName(args.Name).Name+“.dll”);
如果(!File.Exists(assemblyPath))
{
返回null;
}
其他的
{
返回Assembly.LoadFrom(assemblyPath);
}
}
私有类型loadFromAppDomain(字符串类名称)
{
Assembly[]asses=AppDomain.CurrentDomain.GetAssemblys();
列表类型=新列表();
foreach(组装组件中的组件)
{
类型t=ass.GetType(类名称);
如果(t!=null)类型。添加(t);
}
如果(types.Count==1)
返回类型。First();
其他的
返回null;
}

为什么您认为MEF不可靠?你还看了什么?这样的设计问题可能会更好,但您需要提供更多详细信息并展示您所考虑的内容。您希望它具有多大的热插拔能力?当旧部件在使用时,您是否能够替换现有部件?您愿意为该功能支付多少性能费用?跨越AppDomain边界并不便宜(这是.Net中隔离具有相同标识的DLL的唯一方法)。。。IIS模型(在更改二进制文件/配置时重置AppDomain)是否适用于您?请查看.NET Framework的卷影副本,以及MEF的DirectoryCatalog和重新编译功能。一个快速的原型可以基于这个Q&A@DmitriNesteruk,希望你在过去的三年里已经解决了这个问题+1以获得彻底的答案。这就是Microsoft打算让您进行热交换的方式。+1。这种方法显然只适用于强类型、版本正确的程序集@evanmcdonnal,旁注-请不要将组件缩短为3个字母。。。看起来很有趣,直到你需要请别人阅读你的代码,特别是那些没有那么高级幽默感的人。@Alexei我希望我们都有很好的幽默感。我同意强类型、版本控制的程序集。OP没有深入讨论这个细节,但该方法在我的环境中运行良好。
String dllFolder = "C:\\dlls";

public void newAppDomain()
{
    AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(assemblyResolve);
}

private static Assembly assemblyResolve(Object sender, ResolveEventArgs args){
    String assemblyPath = Path.Combine(dllFolder, new AssemblyName(args.Name).Name + ".dll");
    if(!File.Exists(assemblyPath))
    {
        return null;
    }
    else
    {
        return Assembly.LoadFrom(assemblyPath);
    }
}

private Type loadFromAppDomain(String className)
{
    Assembly[] asses = AppDomain.CurrentDomain.GetAssemblies();
    List<Type> types = new List<Type>();
    foreach(Assembly ass in asses)
    {
        Type t = ass.GetType(className);
        if(t != null) types.Add(t);
    }
    if(types.Count == 1)
        return types.First();
    else
        return null;
}