私は最近同じ問題に遭遇しました。MS のドキュメントを調べましたが、適切な解決策が見つかりませんでした。最終的に、以下で説明する方法を使用して、WinForms デザイナーのイメージ エディターに他のプロジェクトのリソース ファイルを認識させることができました。それはハックです-誰かが共有したいよりクリーンなソリューションを持っている場合は、投稿してください. これは VS 2008 でのみテストしました。
始める前に、Resources.resx ファイル内の項目を他のプロジェクトからアクセスできるようにする場合は、そのプロパティを編集し、生成されたクラスのアクセス修飾子を public に設定して、PublicResXFileCodeGenerator を使用するようにします。以下の体操は、上記の Douglas の投稿で説明されているように、WinForms デザイナーにこのリソース ファイル内の画像をピックアップさせたい場合にのみ必要です。
ソリューションに次のレイアウトがあるとします。ここでは、さまざまなプロジェクトの既定の名前空間 (ソリューション エクスプローラーでプロジェクト ノードを右クリック -> [プロパティ] -> [アプリケーション] タブ) が重要なので、プロジェクト名の後に括弧で囲みました。
- マイソリューション
- SharedProject (デフォルトの名前空間 = SharedProject)
- WinFormsProject1 (デフォルトの名前空間 = WinFormsProject1)
- WinFormsProject2 (デフォルトの名前空間 = WinFormsProject2)
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)
- WinFormsProject2 (デフォルトの名前空間 = WinFormsProject2)
テキスト エディターで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>
ここで重要なのはCustomToolNamespaceとLogicalNameです。既定では、Visual Studio はプロジェクトの既定の名前空間を使用してリソースに名前を付け、*.Designer.cs ファイルを生成します。SharedProjectとWinFormsProject1には異なる既定の名前空間があるため、既定の動作により、WinFormsProject1 に埋め込まれたリソースは、SharedProject内にある *.Designer.cs ファイルと互換性がなくなります。これは、CustomToolNamespace と LogicalName をオーバーライドすることで防ぐことができます。
WinFormsProject2.csprojについても同じことを行います。Visual Studio に戻ります。csproj ファイルを変更したことがわかり、プロジェクトをリロードするように求められます - 「リロード」を選択します。WinFormsProject1とWinFormsProject2の両方でフォームをデザインするときに、 SharedResources.resxから画像を選択できるようになりました。
基本的に、これらすべてが行うことは、VS にSharedProjectのSharedResources.resxファイルをWinFormsProject1およびWinFormsProject2プロジェクトに含めることです。.resx ソース ファイルは ( SharedProject内に) 1 つしかありませんが、ソリューションをコンパイルすると、実際にはSharedProject.SharedResourcesと呼ばれる 3 つの同一のクラスが 3 つのアセンブリのそれぞれに 1 つずつ存在しますが、すべてが内部可視性を持っているため、干渉しません。プロジェクト間の参照を追加しても、相互に。