我的解决方案中有两个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);
}
}