Как статически объявить тип во время компиляции с помощью AssemblyQualifiedName в C#

Возможный дубликат:
когда должны ли мы использовать ключевое слово extern alias в C#?

У меня есть сборка, состоящая в основном из файлов, совместно используемых другими проектами в решении. Другими словами, все решение будет занимать около 10 МБ, но я экспортирую небольшое подмножество этой функциональности в отдельную сборку размером 200 КБ. Все проекты решения находятся в тестовом проекте NUnit, кроме пользовательского интерфейса.

Проблема в том, что я решил добавить тест для одного из общих файлов и получил следующую ошибку:

The type 'xxx' exists in both 'c:\path\to\project\Logic.dll'
and 'c:\path\to\project\Exported.dll'.

Я знаю, что могу использовать отражение и предоставить полное имя сборки, или я могу удалить экспортированные тесты сборки в отдельный проект, но и то, и другое было бы проблемой. Я просто хочу указать использовать версию xxx в Logic.dll во время компиляции. Можно ли указать, какую версию Type использовать во время компиляции, чтобы это выглядело так:

xxx blah = new xxx();
blah.DoSomething(123);

вместо:

Type t = Type.GetType("Logic.xxx, Logic");
object blah = Activator.CreateInstance(t);
t.GetMethod("DoSomething").Invoke(blah, new object[] { 123 });

person Bryce Wagner    schedule 06.12.2012    source источник
comment
Разве вы не можете просто поместить «xxx» в другое пространство имен? Затем вы получите к нему доступ по namespace.xxx blah = new namespace.xxx();   -  person Mark    schedule 07.12.2012
comment
Я бы не сказал, что это дубликат, потому что мне нужно знать, что внешний псевдоним вообще существует, чтобы иметь возможность искать по нему. Но я бы принял это как ответ, если бы вы опубликовали его как реальный ответ.   -  person Bryce Wagner    schedule 07.12.2012


Ответы (2)


Вы должны иметь возможность указать ссылку на основе пространства имен, в котором находится нужный объектный класс. Что-то в этом роде:

LogicNamespace.XXX blah = new LogicNamespace.XXX();

person Corey Adler    schedule 06.12.2012
comment
У них не может быть разных пространств имен, потому что файл в экспортируемой библиотеке — это точно такой же файл в основном проекте, это просто ссылка. Я не хочу поддерживать две копии. - person Bryce Wagner; 07.12.2012
comment
Скорее всего, несвязанный ответ - я считаю, что OP хочет различать 2 типа сборки из одного и того же источника, но из 2 разных сборок. Таким образом, пространство имен + имя типа одинаковы, единственная разница - это имя сборки. - person Alexei Levenkov; 07.12.2012
comment
@AlexeiLevenkov Да, это правильно. Ответ Ханса Пассана - это именно то, что я искал, но он не опубликовал его там, где я могу его принять. - person Bryce Wagner; 07.12.2012

Комментарий Ханса Пассана - правильный ответ: "внешний псевдоним" - это то, что я искал, и ответы в Когда мы должны использовать ключевое слово extern alias в C#? дать хорошие указания, как его использовать.

person Bryce Wagner    schedule 06.12.2012