C# 如何在C中通过AssemblyQualifiedName在编译时静态声明类型#

C# 如何在C中通过AssemblyQualifiedName在编译时静态声明类型#,c#,assembly-resolution,C#,Assembly Resolution,可能重复: 我有一个程序集,它主要由解决方案中其他项目共享的文件组成。换句话说,整个解决方案大约是10MB,但我将该功能的一小部分导出到一个单独的200KB程序集中。解决方案中的所有项目都在NUnit测试项目中,UI除外 问题是,我为其中一个共享文件添加了一个测试,但出现了以下错误: The type 'xxx' exists in both 'c:\path\to\project\Logic.dll' and 'c:\path\to\project\Exported.dll'. 我知道我可

可能重复:

我有一个程序集,它主要由解决方案中其他项目共享的文件组成。换句话说,整个解决方案大约是10MB,但我将该功能的一小部分导出到一个单独的200KB程序集中。解决方案中的所有项目都在NUnit测试项目中,UI除外

问题是,我为其中一个共享文件添加了一个测试,但出现了以下错误:

The type 'xxx' exists in both 'c:\path\to\project\Logic.dll'
and 'c:\path\to\project\Exported.dll'.
我知道我可以使用反射并提供一个程序集限定名,或者我可以将导出的程序集测试删除到一个单独的项目中,但这两个都会很痛苦。我只想指定在编译时在Logic.dll中使用xxx的版本。是否可以指定在编译时使用类型的哪个版本,因此它看起来如下所示:

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 });

您应该能够基于所需对象类所在的命名空间指定引用。大致如下:


LogicNamespace.XXX blah=新的LogicNamespace.XXX()

Hans Passant的评论是正确的答案:“extern alias”是我正在寻找的,中的答案为如何使用它提供了很好的指导。

您不能将“xxx”放在不同的名称空间中吗?然后通过namespace.xxx blah=newnamespace.xxx()访问它;我不会说这是重复的,因为我必须知道extern alias甚至存在,才能在它上进行搜索。但是如果你把它作为一个实际的答案发布,我会接受这个答案。它们不能有不同的名称空间,因为导出库中的文件与主项目中的文件完全相同,它只是一个链接。我不想保留两个副本。很可能是不相关的答案-我相信OP想要区分来自同一源但来自两个不同程序集的两种类型的构建。所以名称空间+类型名称是相同的,唯一的区别是程序集名称。@AlexeiLevenkov是的,这是正确的。汉斯·帕桑的答案正是我想要的,但他没有把它贴在我能接受的地方。