15

大規模なマルチプロジェクトソリューションのすべての画像リソースを、共有リソース用に特別に作成された新しいプロジェクトに移動しました。

共有イメージが使用されている他のプロジェクトへの新しい参照の追加は、期待どおりに機能しています。下の選択したボタンの画像は引き続きデザイナーに表示されますが、問題があります。

VS Designerでは、イメージエディターで共有リソースを選択できず、代わりにデザイナーコードを手動で編集する必要があります。

具体的には、[画像エディタ]ダイアログ(既存のコントロールの[画像]プロパティからアクセス)で、[ファイル/リソースから選択...]を選択して、[リソースの選択]ダイアログ(表示)をポップアップします。すべてのローカルプロジェクトリソース(Resources.resx)にアクセスし、新しい共有リソースプロジェクトへのアクセスを追加したいと思います。理想的には、共有リソースプロジェクトのresxに切り替える2番目の項目を表示されたドロップダウンに追加します。

これはどのように行うことができますか?もっと良い方法はありますか?

代替テキスト

4

6 に答える 6

25

プロジェクト間で resx ファイルを共有し、VS 2008 SP1 のデザイナーで使用することができました (他のバージョンはわかりません)。他のアプローチとは異なり、ここではリソースが静的および動的に共有されるため、実行時に実際には共有リソースのコピーが 1 つ存在します。ストレージやメモリの無駄がなく、大量のプロジェクトを簡単に維持できます。

ガイドに従って、それがうまくいくかどうか教えてください:

  • クラス プロジェクト Resources を作成します。
  • リソース ファイルを作成します ([プロパティ] -> [プロジェクトのリソース] に移動します)。
  • リソース ファイル (既定の Resources.resx) をプロジェクトのルートに移動します。
  • リソース ファイルの名前を Resources.resx -> GlobalResources.resx に変更します。
  • リソース ファイル修飾子をパブリックに変更します (リソース ファイルをダブルクリックし、[アクセス修飾子] -> [パブリック])。
  • リソース ファイルをプロジェクトのルート ディレクトリにコピーします。
  • [既存のファイルを追加]を使用し、プロジェクトのルートディレクトリでリソースを選択して、リソース ファイルに任意のリソースを追加します。

ソリューション エクスプローラーのプロジェクトは次のようになります。

ここに画像の説明を入力

どのプロジェクトでも、resx ファイルを共有する必要がある場合は、次のようにします。

  • 「リソース」プロジェクトをディペンデンシーとして追加します。

  • プロジェクト ファイル (*.csproj) を手動で編集し、リソース ファイル ItemGroup に次の行を追加します (表示する場合は、ローカル リソース ファイルを作成します)。

     <ItemGroup>
       ...
       <EmbeddedResource Include="..\Resources\GlobalResources.resx">
         <Link>GlobalResources.resx</Link>
         <Generator>ResXFileCodeGenerator</Generator>
         <LastGenOutput>GlobalResources.Designer.cs</LastGenOutput>
         <CustomToolNamespace>Resources</CustomToolNamespace>
       </EmbeddedResource>
       ...
     </ItemGroup>
    

明らかに、"Include" 属性は、GlobalResources.resx への正しい相対パスである必要があります。

  • あなたが求めていたように、デザイナーでリソースを使用してください。

私のプロジェクトでは、これを行うと、次の行が生成され、プロジェクトに自動的に追加されます。

<Compile Include="..\Resources\GlobalResources.Designer.cs">
  <Link>GlobalResources.Designer.cs</Link>
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
  <DependentUpon>GlobalResources.resx</DependentUpon>
</Compile>

追加されていない場合は、手動で追加してください。

これで、プロジェクトはソリューション エクスプローラーで次のように表示されます (likend ファイルは別の方法でマークする必要があります)。

ここに画像の説明を入力

最後の 2 つの手順:

  • リンクされた「GlobalResources.resx」をクリックし、プロパティで「BuildAction」として「None」を設定します。「Custom Tool Namespace」はすでに「Resources」に設定されているはずです。

ここに画像の説明を入力

  • リンクされた「GlobalResources.Designer.resx」をクリックし、プロパティで「BuildAction」として「None」を設定します。

ここに画像の説明を入力

これで完了です。この時点で、質問の [Project Resource file] ダイアログで [GlobalResources.resx] を選択して、デザイナーの共有 resx に追加したリソースを実際に使用できるはずです。そして言われたように、それは実行時でも本当に共有されます! [プロパティ] パネルに、外部プロジェクトの完全な名前空間とクラスが表示されます。「リソース」プロジェクトへの依存関係を削除すると、コンパイルさえしません。うまくいかない場合は、うまくいくまで主張し、場合によってはガイドのどこが間違っているか教えてください. それは働かなければなりません!お知らせ下さい。

于 2011-06-07T19:24:27.893 に答える
9

私は最近同じ問題に遭遇しました。MS のドキュメントを調べましたが、適切な解決策が見つかりませんでした。最終的に、以下で説明する方法を使用して、WinForms デザイナーのイメージ エディターに他のプロジェクトのリソース ファイルを認識させることができました。それはハックです-誰かが共有したいよりクリーンなソリューションを持っている場合は、投稿してください. これは VS 2008 でのみテストしました。

始める前に、Resources.resx ファイル内の項目を他のプロジェクトからアクセスできるようにする場合は、そのプロパティを編集し、生成されたクラスのアクセス修飾子を public に設定して、PublicResXFileCodeGenerator を使用するようにします。以下の体操は、上記の Douglas の投稿で説明されているように、WinForms デザイナーにこのリソース ファイル内の画像をピックアップさせたい場合にのみ必要です。

ソリューションに次のレイアウトがあるとします。ここでは、さまざまなプロジェクトの既定の名前空間 (ソリューション エクスプローラーでプロジェクト ノードを右クリック -> [プロパティ] -> [アプリケーション] タブ) が重要なので、プロジェクト名の後に括弧で囲みました。

  • マイソリューション
    • SharedProject (デフォルトの名前空間 = SharedProject)
      • SharedProject.csproj
    • WinFormsProject1 (デフォルトの名前空間 = WinFormsProject1)
      • WinFormsProject1.csproj
    • WinFormsProject2 (デフォルトの名前空間 = WinFormsProject2)
      • WinFormsProject2.csproj

WinFormsProject1およびWinFormsProject2で使用できるイメージを含むSharedProjectにリソース ファイルを作成します。

最初にSharedProjectのルートに新しいリソース ファイルを作成し、それをSharedResources.resxと呼びましょう。後で明らかになる理由から、このファイルは PublicResXFileCodeGenerator ではなく ResXFileCodeGenerator を使用することが重要です。

Visual Studio でSharedResources.resxを編集し、共有するイメージ リソースを追加します。Visual Studio は、 SharedResources.designer.csという名前のSharedProject内にクラス ファイルも生成する必要があります。

ソリューションは次のようになります。

  • マイソリューション
    • SharedProject (デフォルトの名前空間 = SharedProject)
      • SharedProject.csproj
      • SharedResources.resx
      • SharedResources.Designer.cs
    • WinFormsProject1 (デフォルトの名前空間 = WinFormsProject1)
      • WinFormsProject1.csproj
    • WinFormsProject2 (デフォルトの名前空間 = WinFormsProject2)
      • WinFormsProject2.csproj

テキスト エディターでSharedProject.csprojを開くと、次のエントリが表示されます。

<EmbeddedResource Include="SharedResources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
</EmbeddedResource>
<Compile Include="SharedResources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>SharedResources.resx</DependentUpon>
</Compile>

次に、WinFormsProject1 内でリソースにアクセスできるようにする必要があります。これを行うには、テキスト エディターでWinFormsProject1.csprojを編集する必要があります。これは、設定する必要のあるプロパティの一部が Visual Studio 内で公開されていないためです。

WinFormsProject1.csprojファイルを開き、ItemGroup 内に次を追加します。

<Compile Include="..\SharedProject\SharedResources.Designer.cs">
    <Link>SharedResources.Designer.cs</Link>
    <AutoGen>True</AutoGen>
    <DesignTime>True</DesignTime>
    <DependentUpon>SharedResources.resx</DependentUpon>
</Compile>
<EmbeddedResource Include="..\SharedProject\SharedResources.resx">
    <Link>SharedResources.resx</Link>
    <Generator>ResXFileCodeGenerator</Generator>
    <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
    <CustomToolNamespace>SharedProject</CustomToolNamespace>
    <LogicalName>SharedProject.SharedResources.resources</LogicalName>
</EmbeddedResource>

ここで重要なのはCustomToolNamespaceLogicalNameです。既定では、Visual Studio はプロジェクトの既定の名前空間を使用してリソースに名前を付け、*.Designer.cs ファイルを生成します。SharedProjectWinFormsProject1には異なる既定の名前空間があるため、既定の動作により、WinFormsProject1 に埋め込まれたリソースは、SharedProjectある *.Designer.cs ファイルと互換性がなくなります。これは、CustomToolNamespace と LogicalName をオーバーライドすることで防ぐことができます。

WinFormsProject2.csprojについても同じことを行います。Visual Studio に戻ります。csproj ファイルを変更したことがわかり、プロジェクトをリロードするように求められます - 「リロード」を選択します。WinFormsProject1WinFormsProject2の両方でフォームをデザインするときに、 SharedResources.resxから画像を選択できるようになりました。

基本的に、これらすべてが行うことは、VS にSharedProjectSharedResources.resxファイルをWinFormsProject1およびWinFormsProject2プロジェクトに含めることです。.resx ソース ファイルは ( SharedProject内に) 1 つしかありませんが、ソリューションをコンパイルすると、実際にはSharedProject.SharedResourcesと呼ばれる 3 つの同一のクラスが 3 つのアセンブリのそれぞれに 1 つずつ存在しますが、すべてが内部可視性を持っているため、干渉しません。プロジェクト間の参照を追加しても、相互に。

于 2011-01-30T22:29:52.237 に答える
7

VS2012 のプロジェクト間でリソースを共有する

デザイナーだけの簡単3ステップ!

  1. プロジェクトを作成し、通常どおり共有するリソースを追加します
  2. 別のプロジェクトを作成し、コンテキストメニューからアクセスできる「既存の項目を追加」ダイアログで最初のプロジェクトの resources.resx を「リンクとして追加」します。
  3. 必要に応じて、リンクされたリソース ファイルから画像を選択します。これは、プロパティ ペインからアクセスできる [リソースの選択] ダイアログ内の [プロジェクト リソース ファイル] プルダウン メニューで選択できます。

出来上がり!

于 2013-05-06T06:19:36.717 に答える
1

リソース (画像、テキストなど) を含む RESX ファイルを使用して、新しいクラス プロジェクトを追加するだけです。他のプロジェクトでこれへの参照を追加した後、必要なリソースにアクセスするためにリソース クラス名を使用します。

于 2012-09-16T00:50:14.213 に答える