20

多くのプロジェクトを含むかなり大きなソリューションがあります。理想的には、アプリケーション全体で必要なすべての埋め込みアイコンを含むリソースプロジェクトを作成したいと思います。

人々がコードを介してそれらを参照している記事を読んだことがありますが、デザイナーでこのプロジェクトのリソースにアクセスすることは可能ですか?つまり、デザイナーでフォームのBackgroundImageプロパティをクリックするときにリソースを選択したいと思います。

そうでない場合、リソースをメインプロジェクトから切り離そうとするときに、どのようなアーキテクチャを検討する必要がありますか?1行か2行のコードを変更するたびに、100MBの実行可能ファイルをリリースするのは賢明な考えではありません。

4

3 に答える 3

4

多くのプロジェクト間でリソースファイルを共有し、VS Designerの互換性(VS 2012で動作)を維持するための実用的な方法を見つけました。複雑ではありません。

  1. ソースプロジェクトに新しいリソースファイルを作成します(私の例ではSharedResources.resxという名前です)

  2. DesignerでSharedResources.resxを開き、のように変更Access Modifierします。Public

  3. .csprojメモ帳で新しいプロジェクトファイルを開き、:を含む次のコードを追加します(<ItemGroup>コンパイル<compile Include="MyForm.cs">なしで特別な名前空間を持つリンクとして*.resxと*.Designer.csが含まれます)

    <EmbeddedResource Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <Link>SharedResources.resx</Link>
      <LastGenOutput>SharedResources.Designer.cs</LastGenOutput>
      <SubType>Designer</SubType>
      <CustomToolNamespace>MY_SOURCE_PROJECT_NAMESPACE.Properties</CustomToolNamespace>
    </EmbeddedResource>
    <None Include="MY_SOURCE_PROJECT_FOLDER\Properties\SharedResources.Designer.cs">
      <AutoGen>True</AutoGen>
      <DependentUpon>SharedResources.resx</DependentUpon>
      <DesignTime>True</DesignTime>
    </None>
    
  4. MY_SOURCE_PROJECT_FOLDERリソースを含むプロジェクトの相対パスに置き換え、MY_SOURCE_PROJECT_NAMESPACE生成されたファイルで指定された名前空間に置き換えますSharedResources.Designer.cs(グローバルプロジェクトの名前空間である必要があります)

  5. 楽しみ !

警告 :

VSが**。Designer.cs*共有ファイルに他の自動変更を加えて失敗する場合があります。プロパティResourceManagerがルート共有ファイルを指していることを確認してください。 ここに画像の説明を入力してください

重要 :

  • resxファイルに新しいリソースを追加するときは、ソースプロジェクトから開いてください。そうしないと、ファイルが間違ったフォルダーに追加されます。
  • 新しいリソースを追加したばかりのときに、新しいプロジェクトに表示されない場合は、VSを再起動するだけで機能するはずです。
于 2014-02-20T10:47:51.233 に答える
3

私が知る限り、デザイナの他のアセンブリのリソースを操作することはできません。現在のプロジェクトからのものだけ。

これが私がそれをする方法です:

クラスライブラリプロジェクトを作成します。ライブラリで、追加| 新商品| リソースファイル。そのファイル(例:Resource1.resx)にリソース(画像、アイコン)を追加します。そのライブラリのクラスに、リソースを返すパブリックメンバーを追加します。

public static class Class1
{
    public static Bitmap Image1 { get { return Resource1.Image1; } }
    public static Bitmap Image2 { get { return Resource1.Image2; } }
}

プロジェクトでクラスライブラリを参照し、実行時にプログラムでリソースを設定できるようになりました。

public Form1()
{
    InitializeComponent();

    this.BackgroundImage = ClassLibrary1.Class1.Image1;
}

ただし、残念ながらデザイナーは使用できません。:(ただし、これを行うことにより、そのdll内のリソースに変更を加えない場合は、そのdllを再配布する必要がなくなります。

于 2013-02-19T09:15:05.413 に答える
2

アプリケーション全体に必要なすべての埋め込みアイコンを含むリソースプロジェクトを作成したいと思います。デザイナーでフォームのBackgroundImageプロパティをクリックするときに、リソースを選択したいと思います。

別のアセンブリのリソースを使用することはできますが、残念ながら、以下で説明する理由により、デザイナーを介して使用することはできません。

ここに画像の説明を入力してください

リソースプロジェクトで、画像ボックス付きのフォームを追加し、BackgroudImageを設定します。これは、プロジェクトResouces.resxおよびResouces.Designer.csに画像を追加するためだけのものです。画像がリソースとして追加された後、画像ボックス付きのフォームを削除できます。

リソースプロジェクトで、Resouces.Designer.csに移動し、クラススコープをパブリックに変更し、イメージメソッドスコープを内部からパブリックに変更します。

public static System.Drawing.Bitmap SO_down {
    get {
        object obj = ResourceManager.GetObject("SO down", resourceCulture);
        return ((System.Drawing.Bitmap)(obj));
    }
}

リソースDLLを使用するプロジェクトでは、独自のリソースを使用しないようにBackGroundImagesを設定する必要があります。

前:

this.pictureBox1.BackgroundImage = global::WinFormWithSatelliteResources.Properties.Resources.SO_down;

後:

this.pictureBox1.BackgroundImage = global::SatResources.Properties.Resources.SO_down;

リソースをメインプロジェクトから切り離そうとする場合、どのようなアーキテクチャを検討する必要がありますか?1行か2行のコードを変更するたびに、100MBの実行可能ファイルをリリースするのは賢明な考えではありません。

最近では、ほとんどの企業がインターネットに頼ることを喜んでいます。MyStyle22022013.CSSやwebbrowsersのようなリソースをバージョン管理する方法を知っていると、それらがすでに最新のコピーを持っている場合、リソースをフェッチしません。同様の戦略を提案します。これらのイメージリソースをすべてオンラインにして、パッケージ化して展開しなくてもリソースを更新できるようにします。

このように考えると、なぜリソースだらけのアセンブリでさえ悩むのでしょうか。Mazeは、インターネットからリソースを取得し、ファイルシステムからそれらを使用するだけです。

(リソースをダウンロードするための)最初のインターネットアクセスがオプションでない場合、@jrossの回答は完全に実行可能であるように思われます。最近はCDでリリースする予定はないと思いますが。

于 2013-02-22T00:45:02.403 に答える