在我目前正在开发的项目上,我们已经开展了大量工作来设计窗体风格并使其与业务规则更加一致。这涉及到诸如填充表单,更改标签,更改列标题等内容 - 基本上加载了一些东西。C#反思 - 在运行时确定依赖项的位置
我被要求研究生产一种工具的可行性,以比较我们的原始形式和新的形式,看看发生了什么变化。我已经沿着使用反射的路线 - 获取原始DLL并依次加载表单并比较控件(我想不出一个更简单的方法来做到这一点,因为我们的很多表单都有其他项目“注入”在运行时,所以设计器文件的比较将不起作用
在我的项目中,我创建了两个名为“OriginalAssemblies”和“CurrentAssemblies”的目录,并且在每个目录中都有一个依赖目录,其中包含所有依赖于窗体的程序集,这些文件的主要区别在于原始和当前
我的第一个方法基于目录读取程序集,然后存储在列表中 - 有一个用于原创,另一个用于当前:
private static void LoadInAssemblies(string sourceDir, List<Assembly> assemblyList)
{
DirectoryInfo dir = new DirectoryInfo(sourceDir);
foreach (FileInfo currentFile in dir.GetFiles().Where(f => f.Name.Contains("dll")))
{
assemblyList.Add(Assembly.LoadFile(currentFile.FullName));
}
}
这似乎工作正常,因为它加载包含窗体的DLL。接下来,我有一种方法,以不同的形式加载并处理它们。这将运行,但它在依赖从同一目录每次
foreach (Assembly current in originalAssemblies)
{
var items = current.GetTypes().Where(t => t.IsSubclassOf(typeof(Form)) && !t.Name.Contains("Base")).ToList();
foreach (var newForm in items)
{
Object originalForm = Activator.CreateInstance(newForm);
// get the associated assembly from the new form
Object currentForm = Activator.CreateInstance (currentAssemblies.SelectMany(a => a.GetTypes()).Where (t => t.Name == newForm.Name).First());
((Form)originalForm).ShowDialog();
((Form)currentForm).ShowDialog();
}
}
加载了一些研究,我发现参考在app.config探测之后,所以设置如下:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<probing privatePath="OriginalAssemblies/Dependencies"/>
</assemblyBinding>
</runtime>
现在我意识到,我可以分离目录并具有Current和Original目录,但在这种情况下,它将无法帮助,因为依赖项文件夹中的DLL将是相同的 - 只是不同的程序集版本。
我的问题是,根据上面的代码,有什么办法可以告诉GetType()命令创建对象currentForm时使用正确的目录,在这种情况下会是CurrentAssemblies?
你可以尝试AppDomain.AssemblyResolve事件 – bdn02 2014-09-01 14:38:32
安德鲁,你有帮助吗?请将答案标记为已接受,或提供有关您卡住的详细信息。 – Measuring 2014-09-02 16:47:37