给定一个实例 System.Reflection.Assembly.

有帮助吗?

解决方案

不可能。没有任何内容指定“根”名称空间。选项中的默认命名空间是 Visual Studio 的东西,而不是 .net 的东西

其他提示

当我想通过其清单资源流从当前程序集加载资源时,我多次遇到这种困境。

事实上,如果使用 Visual Studio 将文件作为资源嵌入到程序集中,则其清单资源名称将从 Visual Studio 项目中定义的程序集的默认命名空间派生。

我想出的最好的解决方案(避免将默认命名空间硬编码为字符串)是简单地确保您的资源加载代码始终从也在默认命名空间中的类内部发生,然后采用以下近通用方法可能用过了。

此示例正在加载嵌入式架构。

XmlSchema mySchema;
string resourceName = "MyEmbeddedSchema.xsd";
string resourcesFolderName = "Serialisation";
string manifestResourceName = string.Format("{0}.{1}.{2}",
    this.GetType().Namespace, resourcesFolderName, resourceName);
using (Stream schemaStream = currentAssembly.GetManifestResourceStream(manifestResourceName))
    mySchema = XmlSchema.Read(schemaStream, errorHandler);

也可以看看: 如何获取程序集的命名空间?

编辑:还注意到我正在回答的问题的非常详细的答案 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/3a469f5d-8f55-4b25-ac25-4778f260bb7e

另一个编辑以防有同样问题的人来寻找:在这里解决资源加载问题的好主意: 如何获取项目csproj的默认命名空间(VS 2008)

给定程序集中可以有任意数量的命名空间,并且不需要它们全部从公共根开始。您能做的最好的事情就是反映程序集中的所有类型,并构建其中包含的唯一命名空间的列表。

程序集不一定有根命名空间。命名空间和程序集是正交的。

相反,您可能要寻找的是在该程序集中找到一个类型,然后找出它的命名空间是什么。

您应该能够通过使用 GetExportedTypes() 成员,然后使用返回的类型句柄之一的命名空间属性来完成此操作。

但同样,不能保证所有类型都位于同一名称空间中(甚至位于同一名称空间层次结构中)。

我刚刚创建了一个名为 Root 的空内部类,并将其放入项目根目录中(假设这是您的根命名空间)。然后我在需要根命名空间的任何地方使用它:

typeof(Root).Namespace;

当然,我最终得到了一个未使用的文件,但它是干净的。

GetType(frm).Namespace

frm 是启动表单

获取类型 给你一个列表 类型 程序集中定义的对象。该对象具有名称空间属性。请记住,一个程序集可以有多个命名空间。

命名空间与程序集无关 - 命名空间和程序集中的类之间的任何映射纯粹是由于命名约定(或巧合)。

实际上有一种间接的方法来获取它,通过枚举程序集的清单资源的名称。您想要的名称以您知道的部分结尾。

此处不再重复代码,请参阅 获取 Assembly.GetManifestResourceStream() 方法的默认命名空间名称

我用 typeof(App).Namespace 在我的 WPF 应用程序中。App 类对于任何 WPF 应用程序都是必需的,并且位于根目录中。

我遇到的问题是,“如果我深度调用库代码 N 个方法并想要项目的命名空间 - 例如实际运行的 MVC 应用程序 - 我如何获得它?”

有点 hacky,但你可以获取堆栈跟踪和过滤器:

    public static string GetRootNamespace()
    {
        StackTrace stackTrace = new StackTrace();
        StackFrame[] stackFrames = stackTrace.GetFrames();
        string ns = null;
        foreach(var frame in stackFrames)
        {
            string _ns = frame.GetMethod().DeclaringType.Namespace;
            int indexPeriod = _ns.IndexOf('.');
            string rootNs = _ns;
            if (indexPeriod > 0)
                rootNs = _ns.Substring(0, indexPeriod);

            if (rootNs == "System")
                break;
            ns = _ns;
        }

        return ns;
    }

所有这一切都是为了获取堆栈跟踪,运行从最近调用到 root 的方法,并过滤 System.一旦它找到一个系统调用,它就知道它已经走得太远了,并返回它上面的命名空间。无论您正在运行单元测试、MVC 应用程序还是服务,系统容器都将比项目的根命名空间深 1 级,所以瞧。

在某些情况下,系统代码是跟踪的中介(如 System.Task),这将返回错误的答案。我的目标是采用一些启动代码,并让它轻松地在根命名空间中找到类或控制器或其他任何内容,即使执行工作的代码位于库中。这样就完成了该任务。

我确信这可以改进——我确信这种古怪的做事方式可以在很多方面得到改进,并且欢迎改进。

添加到这里的所有其他答案,希望不重复信息,以下是我如何使用 Linq 解决这个问题。我的情况和Lisa的回答类似。

我的解决方案有以下警告:

  • 您正在使用 Visual Studio 并为您的项目定义了一个根命名空间,我认为这就是您所要求的,因为您使用术语“根命名空间”
  • 您没有从引用的程序集中嵌入互操作类型
Dim baseNamespace = String.Join("."c,
    Me.GetType().Assembly.ManifestModule.GetTypes().
        Select(Function(type As Type)
                    Return type.Namespace.Split("."c)
                End Function
        ).
        Aggregate(Function(seed As String(), splitNamespace As String())
                        Return seed.Intersect(splitNamespace).ToArray()
                    End Function
        )
)

这是获取网站项目的根命名空间的相当简单的方法。

''' <summary>
''' Returns the namespace of the currently running website
''' </summary>
Public Function GetWebsiteRootNamespace() As String
    For Each Asm In AppDomain.CurrentDomain.GetAssemblies()
        If Asm Is Nothing OrElse Asm.IsDynamic Then Continue For

        For Each Typ In Asm.GetTypes
            If Typ Is Nothing OrElse Typ.Name Is Nothing Then Continue For
            If Typ.Name = "MyProject" Then Return Typ.Namespace.Split("."c)(0)
        Next
    Next

    Return Nothing
End Function

这只是检查所有加载的“MyProject”类型的程序集并返回该类型的根命名空间。当单个解决方案中有多个 Web 项目共享日志系统时,这对于日志记录非常有用。希望这对某人有帮助。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top