在对象列表中加载未引用的程序集的类型

时间:2012-05-23 11:40:39

标签: c# reflection .net-assembly

我想从未引用的程序集中获取一个类型。我使用this answer来解决我的问题。

现在的问题是,我正在加载包含来自另一个程序集的另一种类型的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

中加载类型的程序集

3 个答案:

答案 0 :(得分:0)

我对此并不是百分之百确定,但是当我尝试这个时:

public class Moop<T> {}

我做了:

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

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

在Linqpad中

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

答案 1 :(得分:0)

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

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

  1. 解析通用参数类型(myAssembly.otherNamespace.myClass,在您的情况下)
  2. 根据通用参数的类型生成新类型。
  3. 这是一个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 { }
    

答案 2 :(得分:0)

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

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

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