Visual studio 2008 如何获取项目csproj的默认名称空间(VS 2008)

Visual studio 2008 如何获取项目csproj的默认名称空间(VS 2008),visual-studio-2008,namespaces,projects-and-solutions,csproj,Visual Studio 2008,Namespaces,Projects And Solutions,Csproj,我有VS2008和csproj项目(C#Library) 在项目的属性中,具有程序集名称和默认命名空间。 注意:每个类都有一个名称空间 Console.WriteLine ( "Namespace of Entry Point Routine {0} = {1} " , System.Reflection.MethodBase.GetCurrentMethod ( ).Name , System.Reflection.Assembly.GetEntryAssembly (

我有VS2008和csproj项目(C#Library)

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

Console.WriteLine (
    "Namespace of Entry Point Routine {0} = {1} " ,
    System.Reflection.MethodBase.GetCurrentMethod ( ).Name ,
    System.Reflection.Assembly.GetEntryAssembly ( ).EntryPoint.DeclaringType.Namespace );
是否可以在运行时获取默认名称空间的值

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

 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对象)才能阅读?

您不能。

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

我倾向于使用程序集的名称:
assembly.GetName().name
。问题是,只有在程序集名称未更改的情况下,它才起作用

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

string name = assembly.GetManifestResourceNames().Single(p => p.EndsWith(".SyntaxModes.Xml"))

不是100%确定它是您想要的,但是您可以使用以下方法获得名称空间:

this.GetType().Namespace

我为程序集编写了一个扩展方法,该方法仅通过包含的资源中的文件名查找资源:

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");

我来到这个页面是为了确认我在搜索与输入到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
此表达式的实际用途是,您可以使用它来构造条目程序集的属性.Settings属性.Resources命名空间的绝对(完全限定)名称

  • 从应用程序中的任何位置访问设置意味着您可以搜索一个设置,该设置的名称在运行时之前是未知的
  • 从应用程序中的任何位置访问资源意味着可以从整个应用程序域访问存储在条目程序集或其附属资源程序集中的字符串资源,即使它们的名称在运行时之前是未知的
  • 我几乎完成了一个应用程序,该应用程序利用此技术显示存储在资源字符串中的参数名称,这些参数名称基于从参数的内部名称派生的资源名称。这是该工具演示的通用程序参数处理库的核心


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

    也可以从DTE获取DefaultNameSpace。如果您正在开发VisualStudio扩展,这将非常有用

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

    默认名称空间存储在哪里??只有使用Addins Visual Studio(DTE对象)才能读取?您始终可以选择自己读取.csproj XML。这在VS项目中的根命名空间与您所在类的命名空间不相同的情况下(很少)不起作用。您可以自由重命名根命名空间,从而破坏代码。这不起作用,在不太罕见的情况下,但可能很难诊断,很容易破坏(没有什么强制默认程序集命名空间与其中的类型相同)默认命名空间存储在何处?我想上面已经回答了这个问题:它不存储在程序集中。“默认名称空间”的概念是一个VisualStudio概念,在编译时命名嵌入式资源时使用。对于不知道默认名称空间的问题,我觉得我发布的代码是一个优雅的解决方案。