2015-02-20 5 views
3

Я изо всех сил фальсифицировать эти две строки кода:Как я могу подделать Assembly.LoadFile и Assembly.GetTypes?

Assembly asm = Assembly.LoadFile(fileName); 
Type[] asmTypes = loggerAssembly.GetTypes(); 

Когда я типа System.Reflection.ShimAssembly нет такого типа, как ShimAssembly, как, например, в случае System.IO.ShimFile, но только StubAssembly.

Я мог бы реорганизовать код и сделать это со статическим вспомогательным методом, например LoadAssemblyAndGetTypes, но это, по-видимому, является ненужным обходным путем. Я бы предпочел решение .

Если он работал только так:

var shimAsm = System.Reflection.Fakes.ShimAssembly.LoadFile = (fileName) => 
{ 
    return ??? 
}; 

var types = shimAsm.GetTypes =() => 
{ 
    return new Type[] { new object() }; 
}; 

Почему это работает для System.IO.File и не System.Reflection.Assembly. Это потому, что Assembly является абстрактным классом?


В моем тестовом модуле я хочу, чтобы проверить, если мой узел загрузчик правильно проверяет, загруженная сборка содержит типы, которые реализуют некоторые интерфейсы, так что я могу создать экземпляр их позже позже.

ответ

3

Я думаю, я нашел ответ, и это не выглядит хорошо:

@Patrick Tseng - Визуальная команда студии - пишет в Shim mscorlib and system limitations:

... у нас есть список типов мы намеренно не позволяем им быть заправленными. Причина в том, что он может потенциально вызвать recurisvely вызов в ваш делегат обхода из самой среды CLR. Например, если среда CLR использует тип в System.Reflection во время выполнения, и вы выполняете , чтобы обходить функции этого типа. Возможно, в результате вы получите ожидаемое поведение , так как поведение во время выполнения будет полностью изменено.

Короче говоря, мы не используем тип значения, System.Reflection. , System.Runtime., XamlGeneratedNamespace и несколько других типов, которые , которые мы считаем важными, и не будут их подгонять.

поэтому, похоже, мне нужно сохранить статический вспомогательный метод.

Смежные вопросы