10

我有 VS 2008 和 csproj 项目(C# 库)。

在项目的属性中,有一个程序集名称和默认命名空间。注意:每个类都有一个命名空间。

是否有可能在运行时获取默认命名空间的值?

我的目标是使用资源,我需要默认命名空间的值:

 Assembly assembly = Assembly.GetExecutingAssembly();

 //foreach (string resourceName in assembly.GetManifestResourceNames()){}

 Stream syntaxModeStream = assembly.GetManifestResourceStream(pathToResources
+ ".SyntaxModes.xml");

更新:

彼得说我不能。默认命名空间不存储在程序集中

var resource = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml"))

默认命名空间存储在哪里?

我只能使用 Addins Visual Studio(DTE 对象)阅读??

4

5 回答 5

16

你不能。

默认命名空间不存储在程序集中的任何位置。这只是 Visual Studio 的一个项目设置。

我倾向于做的是使用程序集的名称:Assembly.GetName().Name. 这样做的问题是,它仅在程序集名称未更改时才有效。

对于您的具体问题,您可以使用assembly.GetManifestResourceNames()这些名称并对其进行一些测试,例如:

string name = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml"))
于 2011-02-03T12:08:41.457 回答
5

不是 100% 确定这是您要查找的内容,但您可以使用以下命令获取命名空间:

this.GetType().Namespace
于 2011-02-03T12:08:43.683 回答
3

我来到此页面是为了确认我在搜索与输入到 Windows 应用程序的主 Visual Studio 项目属性页面中的根命名空间相对应的程序集属性时没有忽略任何内容。

由于我有一个想法来解决将我带到此页面的用例的问题,并且我预计至少其他一些人会从我的发现中受益,所以我在进行研究时保持页面打开。

正如我所怀疑的,将有意义的,更不用说超级有用的命名空间与入口程序集相关联是相对容易的。以下长表达式返回在任何 Windows 应用程序的Program.cs模块中定义的Program类的命名空间:

System.Reflection.Assembly.GetEntryAssembly().EntryPoint.DeclaringType.Namespace

以下 C# 语句从应用程序域中的任何位置执行,甚至通过到达 DLL 的方法调用,报告入口点例程的名称及其命名空间。

Console.WriteLine (
    "Namespace of Entry Point Routine {0} = {1} " ,
    System.Reflection.MethodBase.GetCurrentMethod ( ).Name ,
    System.Reflection.Assembly.GetEntryAssembly ( ).EntryPoint.DeclaringType.Namespace );

对于名为 OperatingParameters_Demo.exe 的控制台模式程序,其根命名空间为OperatingParameters_Demo,上述语句产生以下输出。

Namespace of Entry Point Routine Main = OperatingParameters_Demo

此表达式的实际用途是您可以使用它来构造条目程序集的Properties.SettingsProperties.Resources命名空间的绝对(完全限定)名称。

  1. 从应用程序中的任何位置访问设置意味着您可以搜索设置,其名称在运行时之前是未知的。
  2. 从应用程序中的任何位置访问资源意味着存储在条目程序集或其附属资源程序集中的字符串资源可以从整个应用程序域访问,即使它们的名称在运行时之前是未知的。

我几乎完成了一个应用程序,它利用这种技术来显示存储在资源字符串中的参数名称,这些参数名称基于从参数的内部名称派生的资源名称。这是该工具演示的通用程序参数处理库的核心。

这个演示项目始于我开始使用程序员工具将 C/C++ 头文件导入项目目录,这样我就可以将自包含项目部署到 GitHub 中,即使头文件的主副本存储在其他地方,因为它们由数十个项目共享。当它的参数解析引擎接近完成时,我意识到我非常接近拥有我多年来一直想要的通用操作参数解析器和后备存储。C/C++ 标头导入器最终将被发布。但是,目前只完成了它的解析引擎。由于它本身很有用,我打算先发布它。请继续关注代码项目GitHub

于 2018-08-23T03:46:53.900 回答
2

我为 Assembly 编写了一个扩展方法,它只在包含的资源中通过其文件名查找资源:

public static Stream GetManifestResourceStreamByFileName(this Assembly assembly, string fileName)
{
    var targetName = assembly.GetManifestResourceNames()
        .FirstOrDefault(x => x.EndsWith("." + fileName));

    return targetName == null ? null : assembly.GetManifestResourceStream(targetName);

}

然后你就这样打电话:

    var assembly = Assembly.GetExecutingAssembly(); // or Assembly.GetAssembly(this.GetType()) or whatever

    var myResource = assembly.GetManifestResourceStreamByFileName("myResource.jpg");
于 2016-02-24T22:26:30.540 回答
0

也可以从 DTE 获取 DefaultNameSpace。如果您正在开发 Visual Studio 扩展,则非常有用。

EnvDTE.DTE dte = GetService(typeof(DTE)) as DTE;
EnvDTE.Projects projects = dte?.Solution.Projects;
if (projects != null)
{
  foreach (EnvDTE.Project project in projects)
  {
    string defaultNameSpace1 = project.Properties.Item("DefaultNameSpace").Name;
    foreach (EnvDTE.ProjectItem projectItem in project.ProjectItems)
    {
      string defaultNameSpace2 = projectItem.Properties.Item("DefaultNameSpace").Name;
    }
  }
}
于 2020-04-22T09:54:52.097 回答