我的目标是在多个版本的某个程序集上执行一些“代码片段”。我这样做的方式是在单独的应用程序域中执行该“代码片段”,每个程序集版本一个应用程序域。
只有在“代码片段”通过反射使用程序集时,我才能做到这一点,但我想要的是以强类型方式编写该“代码片段”。
换句话说,假设我有以下程序集:
同时它在AssemblyInfo.cs文件中有以下定义:
现在要执行这段“代码”,我正在使用以下控制台应用程序:
控制台应用程序运行良好,但我希望将“PieceOfCode”中的反射用法替换为以下内容:
只有在“代码片段”通过反射使用程序集时,我才能做到这一点,但我想要的是以强类型方式编写该“代码片段”。
换句话说,假设我有以下程序集:
namespace ClassLibrary1
{
public class Class1
{
internal const string Version = "1.0.0.0";
public string Method1() { return Version; }
}
}
同时它在AssemblyInfo.cs文件中有以下定义:
[assembly: AssemblyVersion(ClassLibrary1.Class1.Version)]
现在假设我有一个"Versions"文件夹,其中包含该程序集的多个版本,例如:
/Versions/
├─ /1000/
│ └─ ClassLibrary1.dll
├─ /1001/
│ └─ ClassLibrary1.dll
└─ /1002/
└─ ClassLibrary1.dll
现在要执行这段“代码”,我正在使用以下控制台应用程序:
class Program
{
static void PieceOfCode(Assembly assembly)
{
Type class1Type = assembly.GetType("ClassLibrary1.Class1");
dynamic class1 = Activator.CreateInstance(class1Type);
string vesion = class1.Method1();
Console.WriteLine(vesion);
}
public sealed class SeparateDomainExecutor : MarshalByRefObject
{
public void Execute(Action<Assembly> action, string assemblyPath)
{
action(Assembly.LoadFrom(assemblyPath));
}
}
static void Main(string[] args)
{
foreach (string file in Directory.EnumerateFiles(@"C:\Versions", "*.dll", SearchOption.AllDirectories))
{
AppDomain domain = AppDomain.CreateDomain("ClassLibrary1 Domain");
var type = typeof(SeparateDomainExecutor);
var runner = (SeparateDomainExecutor)domain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
runner.Execute(PieceOfCode, file);
AppDomain.Unload(domain);
}
Console.Read();
}
}
控制台应用程序运行良好,但我希望将“PieceOfCode”中的反射用法替换为以下内容:
static void PieceOfCode()
{
ClassLibrary1.Class1 class1 = new ClassLibrary1.Class1();
Console.WriteLine(class1.Method1());
}
这可能吗?
我所遇到的问题是,PieceOfCode将使用ClassLibrary1的某个特定版本(可能是最新版本)编写,我不知道如何在单独的AppDomain中“覆盖”该版本。 我尝试了几种方法,但最终都出现了FileLoadException。