如何获得项目csproj的默认命名空间(VS 2008)

时间:2011-02-03 12:03:08

标签: visual-studio-2008 namespaces projects-and-solutions csproj

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

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

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

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

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

5 个答案:

答案 0 :(得分:14)

你不能。

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

我倾向于使用程序集的名称:Assembly.GetName().Name。这个问题是它只有在程序集名称没有改变时才有效。

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

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

答案 1 :(得分:5)

不是100%确定它是您正在寻找的,但您可以使用以下命令获取命名空间:

this.GetType().Namespace

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

由于我有解决此用例问题的想法,这使我进入了此页面,并且我希望至少有一些其他人将从我的发现中受益,因此在进行研究时,我将页面保持打开状态。< / p>

正如我所怀疑的,将有意义的(更不用说非常有用的)命名空间与条目程序集关联起来相对容易。以下很长的表达式返回在任何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.Settings Properties.Resources 命名空间的绝对(完全限定)名称。入口组装。

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

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

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

答案 4 :(得分: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;
    }
  }
}