起初我以为你可以用Equals
或ReferenceEquals
来做到这一点,但这个证明太容易出错。例如,如果您使用Assembly.LoadFile
,则这不起作用。
随着nUnit,我做了下面的测试,这些测试有点基本,但给你一些继续。加载类型的方式很奇怪(请参阅MSDN)。我假设你知道如何做“快速测试”,以防你想检查二进制等,等等(见下面的PS)。
Assembly asm1 = Assembly.LoadFile(@"someDebugAssembly.dll");
Assembly asm2 = Assembly.LoadFile(@"someReleaseAssembly.dll");
// load all the types (the double try/catch is on purpose)
Type[] types1 = null
Type[] types2 = null;
try
{
types1 = asm1.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types1 = e.Types;
}
try
{
types2 = asm1.GetTypes();
}
catch (ReflectionTypeLoadException e)
{
types2 = e.Types;
}
// same length
Assert.AreEqual(types1.Length, types2.Length);
// check each type
IEnumerator types1Enumerator = types1.GetEnumerator();
types1Enumerator.Reset();
foreach (Type t in types2)
{
types1Enumerator.MoveNext();
Assert.AreEqual(types1Enumerator.Current, t);
}
关于代码的说明:这种比较方法将两个包含相同类型的程序集视为相等。这意味着调试和发布版本,或不同的版本,都没有考虑在内。使用asm1.GetName()
及其属性(再次:不要使用Equals!)来比较各个字符串(版本,全名等)。 PS:定义什么构成两个相等的组件是有趣的,:
- 它们是二进制等于
- 有版本,完全合格的名称是相等的
- 强名称相同
- 所有类型,深受相比,具有相同的签名
视你选择什么,两个完全不同的程序集(即调试版本与发布版本)可以相同。这真的取决于你想如何比较。
更新:纠正以前的错误,并添加代码示例
@james,你说你真的在寻找一个程序化的解决方案。检查代码,这是否会更接近?让我们知道我们可以改进的地方。 – Abel 2009-11-17 19:57:10
@Abel我希望今晚能测试一下。我无法像我希望昨晚那样,希望今晚我能知道更多。今晚会让你知道/标记一个答案。 – JamesEggers 2009-11-17 20:24:41