2012-12-06 9 views
12

私のAssemblyInfoは、このデータは、現在のハードCSファイルに記述されて...私の製品、会社などに関する情報が含まれています:ローカライズAssemblyInfo.cs

[assembly: AssemblyCompany("My Company.")] 
[assembly: AssemblyProduct("MyProduct")] 
[assembly: AssemblyCopyright("Copyright © 2012 My Company, Inc. All Rights Reserved.")] 
[assembly: AssemblyTrademark("MyProduct is a trademark of MyCompany Software.")] 
[assembly: AssemblyCulture("")] 

私はこれらのテキストをローカライズしたいのですが、私が行うことができません次のようになります。

[assembly: AssemblyCompany(Resources.MyConpany)] 

方法はありますか?

+3

これらは時定数をコンパイルする必要があります。私は、通常、これらの文字列がローカライズされているとは見ません。 – vcsjones

+1

会社の名前のようなものは、通常はローカライズされていません。マイクロソフトは世界中のマイクロソフトです。 –

+0

@JonB:まあまあです。少なくともソフトウェア世界の外では、実際には国によって製品に異なる会社名を使用するさまざまな企業が存在します。メタデータは通常、ソフトウェアの制作/出版された国で使用されている名前を示すことに同意します。興味深い! –

答えて

3

AssemblyInfoを「直接」ローカライズすることはできません(たとえば、Resources.MyCompanyを使用してください)。実際のコンパイルの前に、完全なAssemblyInfoをコンパイル時に生成することができます。ここで

は無料&オープンソースMSBuild Community Tasksでこれを行うにはどのようにいくつかの例は以下のとおりです。

両方のリンクがあります別のMSBuildのファイルでそれを行う方法を示していますソリューションをビルドするために呼び出されましたが、これを.csprojファイルに直接入れることもできます。これは、ソリューションiを構築するときにAssemblyInfo.csの作成が機能することを意味しますn Visual Studio。

これは私のプロジェクトの1つの例です。
(私は、この例では、全体AssemblyInfo.csを生成しないことに注意してください、しかし、唯一のバージョン番号が含まれている個別のファイル!)

MSBuildのコミュニティタスクを呼び出す.csproj fileである:

<Target Name="BeforeBuild"> 
    <PropertyGroup> 
     <ProdVer>0.0</ProdVer> 
    </PropertyGroup> 
    <PropertyGroup> 
     <ProdVer Condition="'$(VersionNumber)' != ''">$(VersionNumber)</ProdVer> 
    </PropertyGroup> 
    <AssemblyInfo CodeLanguage="CS" OutputFile="AssemblyVersion.cs" AssemblyVersion="$(ProdVer)" AssemblyFileVersion="$(ProdVer)" /> 
    </Target> 

<AssemblyInfo ...行はMSBuildコミュニティタスクを呼び出してAssemblyVersion.csというファイルを作成し、バージョン番号は$(ProdVer)に設定しています。
$(ProdVer)は、数行前に0.0に設定され、空でない$(VersionNumber)という名前の環境変数がある場合は、$(ProdVer)がその値に設定されます。
$(VersionNumber)は、バッチファイルでset VersionNumber=1.1を呼び出すだけでビルドスクリプトを呼び出す前に設定されています。

これは、ビルドスクリプトを経由して構築するときAssemblyVersion.csは、Visual Studioからビルドする際に0.0のバージョン番号を使用して作成し、実際のバージョン番号を持つ(私の例1.1に)されることを意味します。

このように、ローカライズされた会社情報をこのようにアセンブリに入れることは、Resources.MyCompanyと呼ぶよりも多くの作業ですが、希望通りに AssemblyInfoをローカライズすることは可能です。

8

はい、可能です。属性そのものは、人間が言語を気にすることはめったにありません。ただし、C#コンパイラでも/ win32resコンパイルオプションの既定のバージョンを生成するために使用されます。

プロパティのショートカットメニュー項目を使用し、詳細タブを確認して、エクスプローラでアセンブリプロパティを表示するときに表示される内容に影響します。ここでWindowsが表示する内容は、ではなく、です。アセンブリ属性については、管理対象アセンブリについては何も知られていません。表示されているのは、の管理されていないリソースのデータで、アセンブリに埋め込まれています。

これらの管理されていないリソースは、Visual Studioでどのように見えるかを確認できます。 File + Open + Fileを使用し、サンプルEXEアセンブリに移動します。組み込みリソースのツリービューが表示されます。典型的な.NETプログラムには少なくとも3つが必要です。アイコン、UACと互換性のあるマニフェスト。そしてあなたが気にするバージョンのリソース。そのノードを開くと、[中立]とマークされたID 1のリソースが表示されます。ニュートラルは、リソースの「任意の言語の作品」バージョンです。それをダブルクリックしてエディタを開き(Expressでは動作しません)、アセンブリ属性がバージョンリソースプロパティにどのようにマップされているかを確認できます。

これらのアンマネージドリソースは、複数の言語を使用する独自のバージョンを作成するだけで実行できます。そのためには、rc.exeツール(アンマネージリソースコンパイラ)によって.resファイルにコンパイルされる.rcファイルを作成する必要があります。プロジェクト+プロパティ、アプリケーションタブ、 "リソースファイル"ラジオボタンを使用してコンパイラに通知します。

これは少し痛みがあり、エラーが発生しやすいことに注意してください.rc.exeは気の利いたツールであり、AssemblyInfo.csとWindowsで見られるものとの間の直接的なリンクを失います。ダミーのC++プロジェクトを使用し、組み込みのリソースエディタを使用して組み立てることをお勧めします。

+0

!私はいつものように、答えはめったに「不可能」または「できない」と思います。 –