Visual Studio是否可以使用与其文件名不同的简单名称构建.NET程序集?

时间:2018-03-06 17:10:24

标签: .net visual-studio msbuild .net-assembly

the System.Reflection.AssemblyName.Name property州的文档:

  

获取或设置程序集的简单名称。这通常(但不一定)是程序集清单文件的文件名减去其扩展名。

我对这里的非常规案件感到好奇。当然,您可以在事后重命名程序集文件,原始文件名将保留为元数据中的简单名称。但这是本文档所暗示的唯一警告,还是有一个"合法的"创建一个文件名与简单名称不同的程序集的方法吗?

通过读取Visual Studio C#/ VB.NET项目(<MSBuild install location>\15.0\Bin\Microsoft.Common.CurrentVersion.targets)使用的默认目标文件,我认为这是AssemblyNameTargetName属性的意图,正如这段摘录所暗示的那样(&#34; ......&#34;对我删节摘录的评论,其他评论来自文件):

<PropertyGroup>
  <!-- Ensure any OutputPath has a trailing slash, so it can be concatenated -->
  <OutputPath Condition="'$(OutputPath)' != '' and !HasTrailingSlash('$(OutputPath)')">$(OutputPath)\</OutputPath>
  <AssemblyName Condition=" '$(AssemblyName)'=='' ">$(MSBuildProjectName)</AssemblyName>

  <!-- ... -->

</PropertyGroup>

<!-- ... -->

<PropertyGroup>

  <TargetName Condition="'$(TargetName)' == '' and '$(OutputType)' == 'winmdobj' and '$(RootNamespace)' != ''">$(RootNamespace)</TargetName>
  <TargetName Condition=" '$(TargetName)' == '' ">$(AssemblyName)</TargetName>
  <!-- Example, MyAssembly -->

  <!-- ... -->

  <TargetFileName Condition=" '$(TargetFileName)' == '' and '$(OutputType)' == 'winmdobj'">$(WinMDExpOutputWindowsMetadataFilename)</TargetFileName>
  <TargetFileName Condition=" '$(TargetFileName)' == '' ">$(TargetName)$(TargetExt)</TargetFileName>

  <!-- Example, MyAssembly.dll -->
</PropertyGroup>

TargetName似乎是构建将生成的文件的名称,没有扩展名,默认情况下它设置为AssemblyName的值。

因此,我在项目文件TargetName中设置了MyProjectName.csproj(摘录,这些属性未在此文件中的任何其他位置定义):

<PropertyGroup>
  <!-- ... -->
  <RootNamespace>MyNamespace</RootNamespace>
  <AssemblyName>MyAssemblyName</AssemblyName>
  <TargetName>MyTargetName</TargetName>
  <!-- ... -->
</PropertyGroup>

我的汇编代码(C#):

using System;

namespace MyNamespace
{
    public class MyClassName
    {
        public static void Main()
        {
            Type myType = typeof(MyClassName);
            Console.WriteLine($"myType.FullName:\r\n\t{myType.FullName}");
            Console.WriteLine($"myType.AssemblyQualifiedName:\r\n\t{myType.AssemblyQualifiedName}");

            var myAsm = myType.Assembly;
            Console.WriteLine($"myAsm.FullName:\r\n\t{myAsm.FullName}");
            Console.WriteLine($"myAsm.CodeBase:\r\n\t{myAsm.CodeBase}");

            var myAsmName = myAsm.GetName(false);
            Console.WriteLine($"myAsmName.Name:\r\n\t{myAsmName.Name}");
            Console.WriteLine($"myAsmName.CodeBase:\r\n\t{myAsmName.CodeBase}");
        }
    }
}

构建时,Visual Studio 2017(15.5.6)会生成一个名为MyTargetName.exe的文件,正如我所料。但是,当我运行程序集时,我发现程序集的简单名称现在 MyTargetName,而不是预期的MyAssemblyName

myType.FullName:
        MyNamespace.MyClassName
myType.AssemblyQualifiedName:
        MyNamespace.MyClassName, MyTargetName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
myAsm.FullName:
        MyTargetName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
myAsm.CodeBase:
        file:///C:/code/MySolutionName/MyProjectName/bin/Debug/MyTargetName.exe
myAsmName.Name:
        MyTargetName
myAsmName.CodeBase:
        file:///C:/code/MySolutionName/MyProjectName/bin/Debug/MyTargetName.exe

我在整个MSBuild安装文件树的.targets.props文件中进行了文本搜索,并且看起来AssemblyName似乎没有设置为值TargetName。 (我搜索<AssemblyName以捕获何时由属性组设置,并"AssemblyName"捕获何时将通过调用任务的输出设置。)这是唯一的其他行我发现,<MSBuild install location>\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.Sdk.props

<AssemblyName>$(MSBuildProjectName)</AssemblyName>

但我不认为这条线用于我的测试项目,因为我希望程序集的简单名称为MyProjectName,而不是MyTargetName。< / p>

0 个答案:

没有答案