the System.Reflection.AssemblyName.Name
property州的文档:
获取或设置程序集的简单名称。这通常(但不一定)是程序集清单文件的文件名减去其扩展名。
我对这里的非常规案件感到好奇。当然,您可以在事后重命名程序集文件,原始文件名将保留为元数据中的简单名称。但这是本文档所暗示的唯一警告,还是有一个"合法的"创建一个文件名与简单名称不同的程序集的方法吗?
通过读取Visual Studio C#/ VB.NET项目(<MSBuild install location>\15.0\Bin\Microsoft.Common.CurrentVersion.targets
)使用的默认目标文件,我认为这是AssemblyName
和TargetName
属性的意图,正如这段摘录所暗示的那样(&#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>