2008-09-18 36 views

回答

34

不可能。没有指定“根”名称空间。在选项中的默认命名空间是一个Visual Studio的东西,而不是一个.NET的事情

+2

来自用户Lisa的下面帖子实际上是这样的,所以这个答案被标记为答案,但没有正确的理由。 – Roboblob 2011-12-27 23:07:27

+6

@Roboblob达伦的答案在技术上是正确的。在VS中建立一个项目的背景下,你想知道这一点的情况下,95%左右的情况下矿井只是有用的。 – Lisa 2012-05-16 04:54:38

9

有可能是任何数量的命名空间在给定的装配,并没有什么要求他们都来自一个共同的根源开始。你可以做的最好的做法是反映程序集中的所有类型,并建立其中包含的唯一名称空间列表。

4

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

您可能正在寻找的是在该Assembly中找到一个类型,然后找出它的名称空间是什么。

您应该能够通过使用GetExportedTypes()成员,然后使用从返回式手柄中的一个命名空间属性来实现这一点。

虽然如此,但不能保证所有类型都在同一个命名空间中(或甚至在相同的命名空间层次结构中)。

1

Get Types为您提供了在程序集中定义的Type对象列表。该对象具有名称空间属性。请记住,程序集可以有多个名称空间。

0

命名空间具有无关组件 - 一个命名空间和在一个组件中的类之间的任何映射是纯粹由于命名约定(或重合)。

+3

尽管我同意,但值得注意的是,Visual Studio项目具有默认名称空间,并且如果使用Visual Studio嵌入资源,那么该资源的清单资源名称是从默认名称空间派生的,并且似乎由程序集本身定义你总是使用Visual Studio来构建程序集。让我们面对现实吧,这很常见。 – Lisa 2011-06-07 02:59:31

47

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

的事实是,如果你使用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); 

参见:How to get Namespace of an Assembly?

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

回答问题的情况下,与人同样的问题,另一个编辑来找:优秀的主意解决资源装载问题在这里:How get the default namespace of project csproj (VS 2008)

+1

此代码实际工作。谢谢! – Roboblob 2011-12-27 23:07:54

+2

当程序集名称与我的项目的“根名称空间”不匹配时,遇到嵌入式资源解析问题。感谢您的帮助 – 2013-11-17 19:45:09

2
GetType(frm).Namespace 

frm是ST artup表格

3

我刚刚创建一个空的内部类称为根,并把它在项目的根(假设这是你的根命名空间)。然后,我用这个到处都是我需要的根命名空间:

typeof(Root).Namespace; 

当然,我结束了一个未使用的文件,但它是干净的。

0

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

0

我在这里找到的问题是,“如果我深入调用库代码N方法并且需要项目的命名空间 - 例如实际运行的MVC应用程序 - 我该如何得到它?”

有点哈克但你可以抓住一个堆栈跟踪和过滤:系统

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; 
    } 

这一切正在做的是获得堆栈跟踪,跑下来,从最近的方法调用根,和过滤。一旦它发现一个系统调用它知道它太过分了,并且返回它上面的命名空间。无论您是运行单元测试,MVC应用程序还是服务,系统容器将比您的项目的根名称空间更深1级,所以瞧。

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

我相信这是可以改进的 - 我敢肯定,这种做事的方式可以在很多方面得到改善,并且改进是值得欢迎的。

0

在这里添加所有其他答案,希望没有重复的信息,这里是我如何使用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 
     ) 
) 
0

这里作为一个相当简单的方式来获得网站幻灯根命名空间嵌入互操作类型克拉。

''' <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项目时,这对于日志记录非常有用。希望这可以帮助某人。

相关问题