给定System.Reflection.Assembly
的实例。如何获得程序集的根名称空间?
回答
不可能。没有指定“根”名称空间。在选项中的默认命名空间是一个Visual Studio的东西,而不是一个.NET的事情
有可能是任何数量的命名空间在给定的装配,并没有什么要求他们都来自一个共同的根源开始。你可以做的最好的做法是反映程序集中的所有类型,并建立其中包含的唯一名称空间列表。
程序集不一定有根名称空间。命名空间和组件是正交的。
您可能正在寻找的是在该Assembly中找到一个类型,然后找出它的名称空间是什么。
您应该能够通过使用GetExportedTypes()成员,然后使用从返回式手柄中的一个命名空间属性来实现这一点。
虽然如此,但不能保证所有类型都在同一个命名空间中(或甚至在相同的命名空间层次结构中)。
命名空间具有无关组件 - 一个命名空间和在一个组件中的类之间的任何映射是纯粹由于命名约定(或重合)。
尽管我同意,但值得注意的是,Visual Studio项目具有默认名称空间,并且如果使用Visual Studio嵌入资源,那么该资源的清单资源名称是从默认名称空间派生的,并且似乎由程序集本身定义你总是使用Visual Studio来构建程序集。让我们面对现实吧,这很常见。 – Lisa 2011-06-07 02:59:31
当我想通过其清单资源流从当前程序集加载资源时,遇到了这种困境。
的事实是,如果你使用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)
此代码实际工作。谢谢! – Roboblob 2011-12-27 23:07:54
当程序集名称与我的项目的“根名称空间”不匹配时,遇到嵌入式资源解析问题。感谢您的帮助 – 2013-11-17 19:45:09
GetType(frm).Namespace
frm
是ST artup表格
实际上有一个间接的方法来获取它,通过枚举程序集的清单资源的名称。你想要的名字以你知道的那部分结束。
而不是重复这里的代码,请参阅get Default namespace name for Assembly.GetManifestResourceStream() method
我刚刚创建一个空的内部类称为根,并把它在项目的根(假设这是你的根命名空间)。然后,我用这个到处都是我需要的根命名空间:
typeof(Root).Namespace;
当然,我结束了一个未使用的文件,但它是干净的。
我在我的WPF应用程序中使用typeof(App).Namespace
。 应用程序类对于任何WPF应用程序都是必需的,它位于根目录中。
我在这里找到的问题是,“如果我深入调用库代码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),这将返回错误的答案。我的目标是拿一些启动代码,并让它很容易地找到一个类或控制器或根名称空间中的任何内容,即使执行该工作的代码位于库中。这完成了该任务。
我相信这是可以改进的 - 我敢肯定,这种做事的方式可以在很多方面得到改善,并且改进是值得欢迎的。
在这里添加所有其他答案,希望没有重复的信息,这里是我如何使用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项目时,这对于日志记录非常有用。希望这可以帮助某人。
- 1. 根名称空间和程序集名称之间的区别
- 2. 获取已加载程序集的根名称空间(程序集名称空间)
- 3. WPF外部程序集名称空间
- 4. 如何查找.NET名称空间的程序集名称,例如Microsoft.WindowsAzure.ServiceRuntime
- 5. 如何引用特定程序集中的名称空间?
- 6. 如何返回System.Collections程序集中的名称空间列表?
- 7. 获取调用方法的名称空间和程序集
- 8. 如何获得名称空间和类名的方法名?
- 9. 如何获得完全合格的程序集名称
- 10. 动态更改名称空间和程序集名称
- 11. 程序集有多个名称空间或由单个名称空间组成
- 12. 获取程序集名称
- 13. 命名空间字符串中的程序集名称
- 14. ILMerge:重命名内部化程序集的名称空间?
- 15. 如何获得表单集ID /名称
- 16. C#如何使用短名称打开程序集(或只有短名称时如何获得强名称)
- 17. 如何获得名称空间属性的值
- 18. 如何获得名称空间的引用Microsoft.WebPages.Compilation
- 19. 如何在我的房产名称中获得空间?
- 20. 如何获得CPU密集程度最高的应用程序的名称?
- 21. 命名空间和程序集名称如何为IronPython类型工作?
- 22. struts2如何获取名称空间值?
- 23. 什么是调用程序集名称的完全限定名称空间?
- 24. 如何将用户空间进程切换回根网络名称空间?
- 25. 什么是RawRabbit的专有名称空间和程序集?
- 26. 使用HttpUtility.UrlEncode()使程序集的名称空间“消失”?
- 27. 使用msxsl中的程序集和名称空间问题
- 28. 如何获得命名空间
- 29. 如何获得已安装应用程序的进程名称
- 30. 命名空间'System'中不存在类型或名称空间名称'Linq'(缺少程序集引用吗?)
来自用户Lisa的下面帖子实际上是这样的,所以这个答案被标记为答案,但没有正确的理由。 – Roboblob 2011-12-27 23:07:27
@Roboblob达伦的答案在技术上是正确的。在VS中建立一个项目的背景下,你想知道这一点的情况下,95%左右的情况下矿井只是有用的。 – Lisa 2012-05-16 04:54:38