C# Can';t为当前执行的程序集中未定义的类型获取类型类的实例

C# Can';t为当前执行的程序集中未定义的类型获取类型类的实例,c#,reflection,C#,Reflection,如何为当前执行的程序集或mscorlib.dll中未定义的类型获取Type类的实例 a) 也就是说,我在assemblyCSharpSnapIn.dll中定义了一个类类型someType,位于E:\CSharpSnapIn.dll,但由于某些原因,当我试图指定此程序集的绝对路径时,我遇到了一个异常: Type t = Type.GetType("someType, E:\\CSharpSnapIn.dll"); // exeception b) 我还尝试将CSharpSnapIn.dll放入当

如何为当前执行的程序集或
mscorlib.dll
中未定义的类型获取
Type
类的实例

a) 也就是说,我在assembly
CSharpSnapIn.dll
中定义了一个类类型
someType
,位于
E:\CSharpSnapIn.dll
,但由于某些原因,当我试图指定此程序集的绝对路径时,我遇到了一个异常:

Type t = Type.GetType("someType, E:\\CSharpSnapIn.dll"); // exeception
b) 我还尝试将
CSharpSnapIn.dll
放入当前运行的应用程序的
\bin\debug
目录中,但仍遇到一个异常:

Type t = Type.GetType("someType, CSharpSnapIn.dll"); // exeception
塔克斯

编辑:

1) 我声明了另一个类类型
someType2
(在
CsharpSnapIn.dll
中),这次它起作用了:

Type.GetType("someType2, CSharpSnapIn");
someType
someType2
之间的区别在于
someType
实现了在外部程序集
asmIn
中声明的接口,但这不应该导致异常,因为
CsharpSnapIn.dll
确实引用了
asmIn

(二)

请注意,程序集不需要 首先加载,只要 程序集解析器可以找到它

换句话说,调用
Type.GetType()
首先加载一个程序集,然后创建一个
Type
实例

(三)

必须通过以下方式找到程序集: 探测,所以它必须在 根据您的第二个bin目录 例子。如果它是一个具有 强名称,你必须给出所有 细节

因此,您的意思是我们不能使用
Type.GetType()
指定(程序集的)绝对路径,而是程序集需要驻留在
bin
目录中?

您需要提供程序集名称,而不是包含它的文件

例如:

Type t = Type.GetType("someType, CSharpSnapIn");
程序集必须通过探测找到,因此它必须位于bin目录中,如第二个示例所示。如果是具有强名称的程序集,则必须提供所有详细信息。请注意,
someType
这里还必须在名称空间方面完全限定

请注意,只要程序集解析器可以找到它,就不需要首先加载程序集。例如,如果程序集与当前正在执行的程序集位于同一目录中,则在大多数情况下都可以

正如Darin所说,另一种方法是直接加载程序集——尽管根据我的经验,在显式加载程序集时有很多“陷阱”,特别是如果在不同位置有两个程序集,它们都依赖于第三个程序集。确保只加载第三个程序集一次可能很棘手

您需要在
LoadFile
LoadFrom
等之间进行选择。以下是MSDN的一些备注:

使用LoadFile方法来加载和 检查具有相同属性的程序集 身份,但位于不同的位置 路径。LoadFile不加载文件 进入LoadFrom上下文,并执行以下操作 不使用 加载路径,如LoadFrom方法 做LoadFile在这方面很有用 有限的场景,因为LoadFrom 无法用于加载以下程序集: 有相同的身份但不同 路径;它将只加载第一个 这样的集会


您需要首先加载程序集:

Type t = Assembly
    .LoadFrom(@"e:\CSharpSnapIn.dll")
    .GetType("SomeNs.SomeType", true);

我非常确定,如果使用Type.GetType(assemblyAualifiedName),可以为程序集传递绝对文件路径name@RuneFS,我很确定你不能。正如@Jon所说,对于
Type.GetType
,程序集需要通过CLR使用的标准探测试探法进行解析(例如,如果程序集位于ASP.NET应用程序的
bin
文件夹中,或者位于控制台和WinForms应用程序的可执行文件所在的文件夹中)。@flockofcode:Yes,除非首先从其他目录显式加载程序集,否则它必须位于探测的文件夹之一。@flockofcode:1)是。2) 不知道例外情况,这很棘手。。。但我猜接口位于不同的程序集中,CLR不知道从何处加载该程序集。@flockofcode:是的,它知道,因为当prober尝试加载接口时,它不使用引用类型的程序集的位置。