Как я могу подделать 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 такое абстрактный класс?


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

1 ответ

Решение

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

@Patrick Tseng - команда Visual Studio - пишет в Shim mscorlib и системные ограничения:

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

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

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

Другие вопросы по тегам