给出一个例子System.Reflection.Assembly
.
当我想通过其清单资源流从当前程序集加载资源时,我经常遇到这种困境.
事实是,如果使用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)
不可能.Nothing指定"Root"命名空间.选项中的默认命名空间是视觉工作室的东西,而不是.net的东西
在给定的程序集中可以有任意数量的命名空间,并且不需要它们都从公共根开始.您可以做的最好的事情是反映程序集中的所有类型,并构建其中包含的唯一命名空间列表.
程序集不一定具有根命名空间.命名空间和程序集是正交的.
你可能正在寻找的是在该程序集中找到一个类型,然后找出它的名称空间是什么.
您应该能够通过使用GetExportedTypes()成员,然后使用其中一个返回的Type句柄中的Namespace属性来完成此操作.
但是,不能保证所有类型都在同一名称空间中(甚至在相同的名称空间层次结构中).