ReflectionTypeLoadException для Microsoft.Web.Administration, выполняющее тестовый проект в VS2010 - PullRequest
2 голосов
/ 03 августа 2010

Мы недавно обновили все наши проекты VS2008 до VS2010.Наша кодовая база все еще нацелена на платформу версии 3.5, но я уверен, что большинство из вас знает, что тестовые проекты должны быть обновлены до версии платформы 4.0.

У нас есть один конкретный набор тестов, который сейчас не работает,тестовый проект ориентирован на фреймворк 4.0.Эти тесты тестируют весь код, который выполняет какую-то задачу отражения.После небольшой отладки мне удалось сузить проблему.

По какой-то причине в обновленном тестовом проекте следующий код:

AppDomain.CurrentDomain.GetAssemblies();

вернет ссылку на "Microsoft.VisualStudio.Enterprise.AspNetHelper».Если я затем вызываю

GetTypes()

для этой сборки, я получаю ReflectionTypeLoadException, в котором говорится, что он не может загрузить сборку "Microsoft.Web.Administration".

Так что мне кажется, что есть некоторыевведите в "Microsoft.VisualStudio.Enterprise.AspNetHelper", который наследует или имеет какую-либо ссылку на другой тип в Microsoft.Web.Administration.Я сделал некоторое чтение и понимаю, что DLL администрирования является частью IIS7.Я занимаюсь разработкой на XP и не установил IIS7.

Мой реальный вопрос - почему Microsoft.VisualStudio.Enterprise.AspNetHelper в моем домене приложений в тестах VS2010, а не в тестах VS2008?Создание простого консольного приложения, которое делает то же самое, не кажется проблемой - только для тестовых проектов.Как мне обойти это?

Ответы [ 2 ]

3 голосов
/ 24 мая 2012

Это немного глупо, но делает трюк:

AppDomain.CurrentDomain.GetAssemblies().Where(a => !IsIgnoredAssembly(a))

, где

private bool IsIgnoredAssembly(Assembly assembly)
{
    // TODO - find a better way to remove "system" assemblies from the auto registration
    var ignoreChecks = new List<Func<Assembly, bool>>()
    {
        asm => asm.FullName.StartsWith("Microsoft.", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("System.", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("System,", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("CR_ExtUnitTest", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("mscorlib,", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("CR_VSTest", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("DevExpress.CodeRush", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("IronPython", StringComparison.InvariantCulture),
        asm => asm.FullName.StartsWith("IronRuby", StringComparison.InvariantCulture),
    };

    foreach (var check in ignoreChecks)
    {
        if (check(assembly))
            return true;
    }

    return false;
}

(взято из TinyIoC - все заслуги Стивена Роббинса.)

Я думаю, что TODO говорит само за себя ... но лучшего способа пока не нашел: -)

1 голос
/ 09 сентября 2010

У меня та же проблема с некоторыми тестами, работающими на тестовом лабораторном компьютере с Win7, но я не могу воспроизвести на моей рабочей станции Server 2008 R2.У меня не включена роль сервера IIS, но Microsoft.Web.Administration находится в моем GAC - я думаю, именно поэтому тесты проходят локально для меня.

Если я заменяю GetExportedTypes () на GetTypes (), яЯ могу обойти это.Это простое решение, если вам не нужны внутренние типы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...