5

私はWinForms、リソースファイルでいくつかの問題を引き起こしているClickOnce配置を使用するC#ソリューションを持っています。つまり、クラスライブラリプロジェクトでコンテンツとしてマークされたファイルは、ClickOnceを使用して展開した後、出力bin/フォルダーにコピーされません。

ソリューションの基本構造は次のとおりです(以下にリストするプロジェクトよりも多くのプロジェクトが含まれています)

Solution 
 |--Gui 1 Project
 |  |--References
 |  |  |--ClassLibrary
 |--Gui 2 Project
 |  |--References
 |  |  |--ClassLibrary
 |--Main Gui Project  (StartUp Project)
 |  |--References
 |  |  |--Gui 1 Project
 |  |  |--Gui 2 Project
 |  |  |--ClassLibrary
 |  |--Datafile.wav    (Build Action: Content, Copy-if-newer)
 |  |--Mods.xml        (Build Action: Content, Copy-if-newer)
 |  |--VariousSourceFiles.cs
 |--ClassLibrary
 |  |--Resources
 |  |  |--Elements.xml     (Build Action: Content, Copy-if-newer)
 |  |  |--AminoAcids.xml   (Build Action: Content, Copy-if-newer)
 |  |--VariousSourceFiles.cs

メインGuiプロジェクトは、このプログラムのスタートアッププロジェクトであり、その中の他のGUIアプリケーションを起動する単純なMDIコンテナーです。開発マシンでデバッグ/リリースモードのいずれかでビルドすると、すべてが期待どおりに機能します。GUIプログラムがコンパイルされ、Datafile.wavファイルとMods.xmlファイルがbin /フォルダーにコピーされ、Elements.xmlファイルとAminoAcids.xmlファイルがbin /Resources/フォルダーにコピーされます。プログラムは問題なく期待どおりに機能します。

ここから問題が始まります。VS2010のClick-Once公開機能を使用して、サーバー上の同僚にプログラムを内部的にリリースします。彼らはプログラムをうまくインストールし、それを起動することさえできます。ただし、リソースファイル(Elements.xmlまたはAminoAcids.xml)の1つを使用するボタンをクリックするとすぐに、ファイルが見つからないという例外がスローされます。これは、他の2つのコンテンツファイル(Datafile.wavとMods.xml)では発生しません。つまり、これらは最終ディレクトリに正しくコピーされます。

したがって、[メインGuiプロジェクト]->[プロパティ]->[公開]->[アプリケーションファイル]に移動すると、Datafile.wavとMods.xmlがこのリストに含まれていることがわかります。ただし、他の2つのコンテンツファイル(Elements.xmlとAminoAcids.xml)はそうではありません。プログラムをサーバーに公開すると、リソースをコピーすることがわからないため、これが問題だと思います。これらのファイルを含める必要があることをClickOnceに通知するにはどうすればよいですか?ClassLibrary.dllはこのリストに表示されますが、.xmlファイルは表示されません。

次に、[クラスライブラリ]->[プロパティ]->[公開]に移動しようとしましたが、クラスライブラリであるため、[公開]のタブがありません。そのため、これら2つのリソースファイルをクライアントコンピューターの最終的なbin/Resourcesファイルにコピーするように指定することはできません。これを克服する方法を知っている人はいますか?

プログラムのユーザーがファイルのコンテンツを変更/更新/拡張する可能性があるため、リソースファイル(.xml)をビルドアクション:埋め込みリソースではなくコンテンツとして保持したいと思います。

4

2 に答える 2

2

私はこれがきれいではないことを知っていますが、それは仕事を成し遂げるでしょう。Microsoftには、公開後にClickOnce配置にデータファイルを追加する方法を示す記事があります。これらの手順をかなり簡単に自動化できます

記事へのリンクは次のとおりです。http: //msdn.microsoft.com/en-us/library/6fehc36e (v = vs.110).aspx

リンクが変更された場合の手順は次のとおりです。Mage.exeを使用してデータファイルを含めるには

1.データファイルをアプリケーションの残りのファイルとともにアプリケーションディレクトリに追加します。

通常、アプリケーションディレクトリは、デプロイメントの現在のバージョン(v1.0.0.0など)でラベル付けされたディレクトリになります。

2.アプリケーションマニフェストを更新して、データファイルを一覧表示します。

mage -u v1.0.0.0 \ Application.manifest -FromDirectory v1.0.0.0

このタスクを実行すると、アプリケーションマニフェスト内のファイルのリストが再作成され、ハッシュ署名も自動的に生成されます。

3.お好みのテキストまたはXMLエディターでアプリケーションマニフェストを開き、最近追加したファイルのファイル要素を見つけます。

Data.xmlという名前のXMLファイルを追加した場合、ファイルは次のコード例のようになります。

<file name="Data.xml" hash="23454C18A2DC1D23E5B391FEE299B1F235067C59" hashalg="SHA1" asmv2:size="39500" /> 

1.この要素に属性タイプを追加し、データの値を指定します。

<file name="Data.xml" writeableType="applicationData" hash="23454C18A2DC1D23E5B391FEE299B1F235067C59" hashalg="SHA1" asmv2:size="39500" /> 

1.キーペアまたは証明書を使用してアプリケーションマニフェストに再署名してから、展開マニフェストに再署名します。

アプリケーションマニフェストのハッシュが変更されたため、デプロイメントマニフェストに再署名する必要があります。

mage -s appmanifest -cf cert_file -pwd password

mage-uデプロイメントマニフェスト-appmアプリマニフェスト

mage-sデプロイメントマニフェスト-cfcertfile-pwd password

于 2013-02-06T07:27:47.890 に答える
0

これはもっと簡単なようです。

  1. データファイルが必要なクラスライブラリプロジェクトディレクトリで、そこにあるデータファイルを見つけます。
  2. クラスライブラリプロジェクトで、[プロジェクトのプロパティ]タブに移動し、[ビルドイベント]タブをクリックして、ビルド後のイベントコマンドラインを更新し、コピーまたはxcopyを使用してスクリプトコードを追加して、データファイルを実行可能アセンブリに相対的にコピーします。これは、プロジェクト参照、プロジェクトのフォルダーによって示されるように、依存関係としてクラスライブラリファイルを使用します。
  3. 実行可能アセンブリのプロジェクトで、コピーしたファイルを「ビルドアクション」「コンテンツ」および「出力ディレクトリにコピー」「常にコピー」のプロパティに含まれるものとして設定します。
  4. 実行可能アセンブリプロジェクトのプロパティで、[公開]タブに移動し、[アプリケーションファイル...]ボタンをクリックします。必ず「すべてのファイルを表示する」にチェックを入れてください。データファイルを見つけ、[公開ステータス]が[含まれている]、[ダウンロードグループ]が[必須]になっていることを確認します。

ClickOnceは、クラスライブラリとともにデータファイルをデプロイし、クラスライブラリコードは実行時にデータファイルを見つけることができます。

どこか間違っていたら訂正してください。

于 2020-10-06T16:20:04.800 に答える