Сначала я подумал, что вы можете использовать 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: было бы интересно определить, что составляет две равные сборки, т. Е .:
- они бинарные равны
- там версии и полные имена равны
- сильные имена равны
- все типы, глубоко сравниваемые, имеют одинаковые подписи
в зависимости от того, что вы выберете, две совершенно разные сборки (то есть отладочная сборка против сборочной версии) могут быть одинаковыми. Это действительно зависит от того, как вы хотите сравнить.
Обновление: исправлены предыдущие ошибки и добавлен пример кода