2016-10-23 33 views
2

VSでビルドするときに、出力アセンブリファイル名を変更する方法はありますか?C#出力アセンブリファイル名(csproj)

私は2つ(デバッグ/リリースブランチを含む4つ)の設定が、少し異なる機能を持ち、別々に使用する必要がありますが、同じディレクトリに残す必要があります。したがって、ProjectName.dllとProjectName.Test.dllが最適です。

AssemblyNameパラメータを変更するようアドバイスしないでください(私がSOを見つけて見た唯一のヒント)、それらは同じではありません。 AssemblyNameは、すべてのクラスの完全なクラス名も変更しますが、これは望ましくありません。私はだけをに変更して、ファイル名を変更し、アセンブリ内に何も残さないようにします。

これで、名前を付けてアセンブリをコピーする.csprojにAfterBuildターゲットを追加しましたが、このソリューションは気に入らないのです。それは簡単かもしれませんか?

また、OutputPathをSomeWhere \ ProjectName.Test.dllに設定しようとしました。これは単にProjectName.Test.dllディレクトリを作成し、そこに$(AssemblyName).dllを置きます。

UPD:AssemblyNameの変更が私が望むものではない理由を明確に説明します。 AssemblyNameは、アセンブリ内のすべての型の一部でもあります(型がどこであるかを示すアセンブリを指します)。これは型解決に直接適用されます。 たとえば、ISomeインターフェイスのProgName.dllを参照します。リゾルバはProgName(型のメタデータに設定されている)を見つけようとしますが、ProgNameがないためProgName.Testだけが見つからないため何も見つかりませんでした。それらがすべてAssemblyName ProgName(.Testではない)を持っていると、動作します。もちろん、私は別のファイル名を扱う場合。

UPD2:のAssemblyNameについて言ったとき、私は何を意味するかのより良い説明: Resolver data screenshot 赤マーク見つけようと何アセンブリリゾルバです。両方の構成でのアセンブリでは同じインタフェースが使用されるため、クライアントはアセンブリを探す必要がありません。両方とも同じAssemblyNameである必要がありますが、同じファイル名(同じフォルダに格納される)を持つ必要があります。

  • A.DLL
  • B.DLL(またはB.Test.dll、構成に応じて)
  • C.DLL
  • は、私は1つに、いくつかのアセンブリをマージするILRepackを使用しました

AとCの両方がB.dllを参照しています。 B.Test.dllを(AssemblyName "B.Test"で)代わりにマージすると、参照は参照のままになります。 B.dllをマージすると、参照は残っていません(内部のすべてのコード)。だから、AssemblyName "B"を持つためにB.Test.dll(このファイル名で)が必要です。

+0

「AssemblyNameを変更すると完全なクラス名が変更される」ことについて説明できますか? VS(プロジェクト>のプロパティ>アプリケーション>アセンブリ名)または手動でcsproj(AssemblyNameプロパティ)を変更してアセンブリ名を変更すると、既存の名前空間とクラス名は変わりません。また、 "Default namespace"プロパティは変更されません(csprojのRootNamespace)。アセンブリ名が変更されたときにルートネームスペースを同期させる拡張機能がインストールされていますか? – Luc

+0

名前の変更がすべて必要な場合は、ポストビルドスクリプトを使用することについて、まったく気に入らないものは何ですか? – blins

+1

Luc、[https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx](https://msdn.microsoft.com/en-us/) library/system.type.assemblyqualifiedname(v = vs.110).aspx)完全な型名にはAssemblyNameが含まれ、型はアセンブリを解決するために使用されます(アセンブリは指定された型からアセンブリされます)。 AssemblyNameを変更すると、私にはさまざまな型解決問題が発生しますが、修正することはできますが、回避する方が良いです。 – rattler

答えて

0

Lucが彼のコメントですでに述べたことを説明するだけで、あなたはcsprojファイルのいくつかの行を簡単に微調整して、あなたが探しているものを達成することができます。

このサンプルを見てみてください。

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" /> 
    <PropertyGroup> 
    <someProps>....</someProps> 
    <RootNamespace>Your.Project</RootNamespace> <!-- Your project namespace stays the same --> 
    <AssemblyName>Your.Project</AssemblyName> 
    <someMoreProps>...</someMoreProps> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <PlatformTarget>AnyCPU</PlatformTarget> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\Debug\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    <AssemblyName>Your.Project.Foo</AssemblyName> <!-- you could simply "override" the resulting assembly name --> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' "> 
    <samePropsAsAbove>...</samePropsAsAbove> 
    <AssemblyName>Your.Project.Bar</AssemblyName> <!-- you could do this on a per-configuration-basis --> 
    </PropertyGroup> 
    ... 

あなたは、単に結果の出力ファイルを変更しているようにすることで。したがって、この例では、出力(デバッグ構成を使用)は、デフォルトのYour.Project.dllの代わりにYour.Project.Foo.dllになります。

これは、あなたが想定しているクラス名または名前空間を変更しません。

+0

今、誤解が起こります。 AssemblyNameを変更すると、クラス名またはnsが変更されることは決してありません。私はクラスのメタデータを意味します。 – rattler

+0

oopsのインスタンスを作成しようとしたとき。 ... "名前を変更した"アセンブリからクラスのインスタンスを作成しようとすると、アセンブリリゾルバはどのDLLを検索しますか? – rattler

+0

もう一度質問を更新して、リゾルバの使い方のスニペットを投稿してください。私はこれがあなたを助けるのに役立つだろうと思う:) – khlr

関連する問題