添加多个程序集以包含在.NET项目中

时间:2019-06-25 12:30:47

标签: c# .net

我的解决方案中有两个4个项目。项目A(服务),项目B(托盘应用程序)和项目C(A和B共享的dll),项目D是独立的,用于更新其他项目。

问题在于,在解决方案上执行远程更新时,项目D必须关闭项目A和B,以便可以同时更新C。这导致它有时无法按预期方式重新启动,并使我无法使用服务的多台远程计算机。

我在这里查看此解决方案,它看起来是理想的解决方案,但仅适用于一个DLL: https://denhamcoder.net/2018/08/25/embedding-net-assemblies-inside-net-assemblies/

我试图弄清楚如何包含多个DLL文件,以使项目A和B完全独立,并能够分别进行更新,但是在弄清楚for循环方面遇到了一些麻烦。

public static void AddManagedHandler() {
    AppDomain currentDomain = AppDomain.CurrentDomain;
    currentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
}

public static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) {
    IEnumerable<string> candidates = FindCandidates(new AssemblyName(args.Name));
    Console.WriteLine("Adding: " + candidates);
    return Assembly.LoadFrom(candidates.First());
}

public static IEnumerable<string> FindCandidates(AssemblyName assemblyname) {
    List<string> candidates = new List<string>();
    foreach (var path in Assembly.GetExecutingAssembly().GetManifestResourceNames()) {
        string candidate = string.Format(@"{0}{1}.dll", path, assemblyname.Name);
        if (File.Exists(candidate)) {
            candidates.Add(candidate);
        }
    }
    if (!candidates.Any()) {
        throw new FileNotFoundException(string.Format("Can not find assembly: '{0}.dll'", assemblyname.Name));
    }
    return candidates;
}

当我尝试实现此功能时,它不会让我逐步进入CurrentDomain_AssemblyResolve部分,因此我不确定如何正确调试它。我有一个名为EmbeddedAssemblies的目录,其中包含大约15个DLL文件,我希望它们可以循环并添加它们。

我可以这样写出来,但这正是循环应该为您做的。

static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EmbedAssembly.EmbeddedAssemblies.Newtonsoft.Json.dll"))
    {
        var assemblyData = new Byte[stream.Length];
        stream.Read(assemblyData, 0, assemblyData.Length);
        return Assembly.Load(assemblyData);
    }
}
static Assembly CurrentDomain_AssemblyResolve2(object sender, ResolveEventArgs args)
{
    using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("EmbedAssembly.EmbeddedAssemblies.Google.Protobuf.dll"))
    {
        var assemblyData = new Byte[stream.Length];
        stream.Read(assemblyData, 0, assemblyData.Length);
        return Assembly.Load(assemblyData);
    }
}

0 个答案:

没有答案