1

我想从未引用的程序集中获取类型。我用这个答案来解决我的问题。

现在的问题是,我正在加载ObjectList包含来自另一个程序集的另一种类型的类型。我这样做:

Assembly assembly = Assembly.LoadFrom ("@c:\myAssemblies\myAssembly.Data.DomainObjects.dll");
Type myType = assembly.GetType ("myAssembly.Data.DomainObjects.ObjectList`1[[myAssembly.otherNamespace.myClass, myAssembly.otherNamespace, Version=1.13.73.1082, Culture=neutral, PublicKeyToken=fee00910d6e5f53b]]");

带有 的程序集otherNamespace也未被引用,因此该GetType方法返回null。我现在的问题是:

是否可以获得包含另一种类型的未引用程序集的对象列表的类型?或者:如何在我的 ? 中加载类型的程序集ObjectList

4

3 回答 3

0

我对此不是 100% 确定,但是当我尝试这个时:

public class Moop<T> {}

我这样做:

Type.GetType("UserQuery.Moop`1") //returns null

Type.GetType("UserQuery+Moop`1") //returns the correct type

在 Linqpad

编辑:'+' 表示它只是一个嵌套类型 - 所以,这可能不是正确的答案。

于 2012-05-23T11:52:16.450 回答
0

好的,这对我来说有点难以测试 - 但我希望我的答案可以转换:

基本上,您需要分两步完成 -

  1. 解析通用参数类型(在您的情况下为 myAssembly.otherNamespace.myClass)
  2. 根据泛型参数的类型生成新类型。

这是一个 Linqpad 脚本:

void Main()
{
    //resolve the inner type
    var  parameterType = Type.GetType("UserQuery+GenericParameter");

    //Use the generic type, and generate with the inner parameter type
    var genericTypeWithParameter = Type.GetType("UserQuery+Moop`1")
        .MakeGenericType(parameterType);

    //The resolved type - printed to console
    genericTypeWithParameter.Dump();
}

public class Moop <T> { }
public class GenericParameter { }
于 2012-05-23T12:06:56.157 回答
0

如果程序集myAssembly.otherNamespace.dll与可执行文件不在同一目录或安装在 GAC 中,则公共语言运行时无法找到它。因此myAssembly.otherNamespace.dll未加载到 AppDomain 并且您无法获得所需的类型。

myAssembly.Data.DomainObjects.dllmyAssembly.otherNamespace.dll放在可执行文件所在的同一目录中,或者将它们安装到 GAC。然后使用Load(而不是LoadFrom)确保将它们加载到相同的Load Cntext

如果程序集 myAssembly.Data.DomainObjects.dll 中的元数据包含对程序集 myAssembly.otherNamespace.dll 的引用则加载前者时应自动加载后者。否则,您必须在获得所需类型之前加载两个程序集。

于 2012-05-23T13:26:25.533 回答