14

My 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)]

これを回避する方法はありますか?

4

2 に答える 2

11

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

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

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

これらの管理されていないリソースの独自のバージョン、つまり複数の言語を使用するバージョンを作成する必要があります。そのためには、リソース スクリプトである .rc ファイルを作成する必要があります。このリソース スクリプトは、アンマネージ リソース コンパイラである rc.exe ツールによって .res ファイルにコンパイルされます。次に、プロジェクト + プロパティ、アプリケーション タブ、[リソース ファイル] ラジオ ボタンを使用して、コンパイラにそのことを伝えます。

これは少し面倒でエラーが発生しやすいことに注意してください。rc.exe は気まぐれなツールであり、AssemblyInfo.cs と Windows で表示されるものとの間の直接リンクが失われます。これはメンテナンス アイテムです。これを実行する最善の方法は、ダミーの C++ プロジェクトを使用し、組み込みのリソース エディターを使用してプロジェクトを組み立てることです。

于 2012-12-07T02:16:24.177 に答える
7

AssemblyInfo を「直接」ローカライズすることができない場合でも (たとえばResources.MyCompany、質問に示されているように使用します)、実際のコンパイルの前に、コンパイル時に完全な AssemblyInfo を生成することができます。

無料でオープン ソースのMSBuild Community Tasksを使用してこれを行う方法の例を次に示します。

両方のリンクは、ソリューションをビルドするために呼び出される別の MSBuild ファイルでそれを行う方法を示していますが、これを .csproj ファイルに直接配置することもできます。つまり、AssemblyInfo.csVisual Studio でソリューションをビルドするときにも作成できます。

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

MSBuild コミュニティ タスクの呼び出しは、.csproj ファイルにあります。

  <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

これは、Visual Studio からビルドする場合AssemblyVersion.csは のバージョン番号で作成され、ビルド スクリプトを使用してビルドする場合は実際のバージョン番号 (私の例では ) で作成されることを意味します。0.01.1

Resources.MyCompany確かに、この方法でローカライズされた会社情報をアセンブリに取り込むのは、単にどこかを呼び出すよりも手間がかかりますが、必要に応じて AssemblyInfo をローカライズすることは可能です。

于 2012-12-06T22:12:17.017 に答える