【问题标题】:How do I get Assembly name from full assembly string?如何从完整的程序集字符串中获取程序集名称?
【发布时间】:2016-03-30 22:00:17
【问题描述】:

我有一个这样的字符串:

"MyProduct.Framework.Business.ShopBusiness"

但它自己的程序集名称只是:

"MyProduct.Framework.Business"

我需要创建一个这样的字符串:

"MyProduct.Framework.Business.ShopBusiness, MyProduct.Framework.Business"

因为我正在尝试解决这个问题: https://stackoverflow.com/a/3512351/375422

所以基本上我有这个:

Type executingClass = Type.GetType(TestContext.FullyQualifiedTestClassName);

我需要这样的东西:

Type executingClass = Type.GetType(TestContext.FullyQualifiedTestClassName + ", " + Assembly.FromString(TestContext.FullyQualifiedTestClassName));

有没有我在上面发明的“Assembly.FromString()”的内置方法?

换句话说:如何从 TestContext 获取正在执行的测试的程序集名称?

【问题讨论】:

  • 我只有这个:TestContext.FullyQualifiedTestClassName
  • 这听起来像XY problem。你的实际目标是什么?
  • 我的目标是提取没有类的程序集名称。所以从这个字符串:“MyProduct.Framework.Business.ShopBusiness”,我想要:“MyProduct.Framework.Business”。有没有内置方法?
  • 如果类型的命名空间与程序集名称不同会怎样?它不会工作!
  • 您无法以直接的方式获得它。类型的全名不足以确定它在哪个程序集中,因为名称空间和程序集是正交的。 TestContext 类也不包含有关正在运行的测试程序集的必要信息。一种方法是扫描程序集列表以查找具有相同全名的类型。您可以从当前 appdomain 中获取已加载程序集的列表,也可以在程序集初始化方法中注册每个测试程序集并搜索它们。

标签: c# .net reflection .net-assembly


【解决方案1】:

类命名空间和程序集名称之间没有直接联系。所以,一般来说,只从类名中获取完全限定名是不可能的。

【讨论】:

    【解决方案2】:

    查找最后一个“.”的位置和该位置的子字符串。

    var fullTypeName = "MyProduct.Framework.Business.ShopBusiness";
    var typeIndex = assemblyTypeName.LastIndexOf(".");
    var namespace = assemblyTypeName.Substring(0, assemblyIndex);
    

    然后添加你的命名空间:

    var assemblyQualifiedTypeName = fullTypeName + ", " + namespace
    

    【讨论】:

    • 感谢您的帮助,但问题是如果“业务”只是一个文件夹,那么我就无法拥有它。我不能只假设字符串的最后一部分是程序集名称。
    • 没有办法可靠地猜测程序集名称。您可以尝试使用 Assembly.GetReferencedAssemblies,然后使用反复试验来找到正确的,但这似乎有点疯狂.. 并且可能有多个相同名称的类型
    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2014-07-03
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    相关资源
    最近更新 更多