15

私が作成した C#/WPF アプリケーションを展開しようとして、サード パーティの DLL への参照が含まれていることに非常に不満を感じていました。プロジェクト内に というフォルダーを作成しlib、ここにこれらの DLL をすべて配置しました。VS2012 では、そのフォルダーを参照し、すべての DLL を選択して参照を追加しました。 Copy Localすべてに設定されtrueています。ビルドして実行するときはすべて問題ありませんが、発行を選択して OneClick インストーラーを作成すると、物事はそれほどスムーズではありません。公開ウィザードで、ディスクからインストールするように設定し、更新をチェックしないように設定しました。そのフォルダーを取り出してフラッシュ ドライブに置き、それを別の PC に接続してセットアップを実行すると、例外がスローされます。何が起こっているのかはわかっていると思いますが、正しく展開するためにこれをパッケージ化する方法がわかりません。

私の DLL の 1 つは、C++ プロジェクト用に設計された DLL への C# ラッパーです。私たちは、ApplicationrequiresDLL1DLL1requiresと言いますDLL2。 はDLL DLL2ではないため、プロジェクトに参照として追加できません。取得するには、同じフォルダにある必要があります。Chromium Embedded FrameworkをラップするCefSharpを使用しています。.NETDLL1DLL2

CefSharp.dll に必要な DLL をpublish/Application Filesディレクトリに配置しようとしましたが、うまくいきませんでした。VS2012 から存在するすべての DLL に.deploy拡張機能があることに気付きました。その拡張機能をスキャンして取得しているかどうかを確認するためにその拡張機能を追加しましたが、機能しませんでした。Windows アプリケーションの開発と展開を行うのはこれが初めてで、読んだ MSDN のすべてのチュートリアルまたはブログ投稿はこのケースをカバーしていないようであり、展開マネージャーにはこれらを処理するための他のオプションがありません。ケースの種類。

それが役立つ場合、スローされる例外コードは次のとおりです。CLR20r3

例外をキャッチして表示すると、提供されるすべての情報は基本的にCefSharp.dll or one of it's dependencies cannot be loaded. DLL2と同じフォルダになかったときに以前に取得したものDLL1

このような状況で VS2012 からデプロイする方法について誰か助けてもらえますか?

前もって感謝します!

編集:情報更新

Visual Studio がインストールされていないテスト マシンにデバッグ ビルド バージョンをプッシュしようとしました。CefSharpまたはその他の C++ ランタイムをビルドする場合、通常は同じ名前ですが、最後に文字 'd' が追加された のDLLすべてのデバッグ バージョンが検索されます。DLL以下で説明するように、C++ ランタイムのデバッグ バージョンは再配布できません。DLLsそれらを手動でプロジェクトに追加して として設定できないわけではありませんがCopy Always、それは一種のハックジョブです。新しいプロジェクトをゼロから開始し、すべてのリリース バージョンの DLL を追加してビルドしましたが、すべて問題ありませんでした。

4

6 に答える 6

23

私は今朝、まさにこの問題を解決しようと頭を悩ませていましたが、最終的に解決策を見つけました. CefSharp が動作するために必要な DLL などは既にご存知のようですが、他の誰かが同じ問題を抱えている場合に備えて、これを実行すると思いました。C# WPF アプリケーションがあり、Web ビューとして CefSharp を使用しています。JavaScriptが必要なため、CefSharp v1を使用しています-> C#ブリッジが提供しますが、v3にはまだ実装されていません。プロジェクトをセットアップする際に行った大まかな手順は次のとおりです (私は VS2013 を使用していますが、これはおそらく VS2012 でも機能します)。

CefSharp のインストール

  • NuGet を使用して CefSharp.Wpf をインストールします (v1.25.7 を使用しています)。
  • これにより、関連するファイルが配置されます$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef

ビルドの構成

  • CefSharp DLL をビルド フォルダーにコピーするには、プロジェクトを右クリックし、[プロパティ] -> [ビルド イベント] を選択し、[ビルド後のイベント コマンド ライン] に次のように入力します。

    xcopy "$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef*" "$(TargetDir)" /s /y /i

  • これで、必要なすべての DLL が cef フォルダー、devtools_resources.pakファイル、localesフォルダー、およびその内容からコピーされます。クロム開発ツールが必要なので、プロジェクトでそれらを必要とします。

  • プロジェクト参照に と が含まれていることを再確認してCefSharpくださいCefSharp.Wpf。これは、NuGet によって処理されているはずです。

Visual C++ 2012 ランタイム ファイルの処理

  • ユーザーが展開の一部として Visual C++ 2012 ランタイム ファイル全体をダウンロードする必要がないようにしたかったので、Visual Studio を使用してフォルダーを追加し、マシンの次のフォルダーからLib\Microsoft.VC110.CRT3 つの DLL ( msvcp110.dllmsvcr110.dll、 ) をフォルダーに追加します。vccorlib110.dllプロジェクトで作成したばかりです:

    C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT

  • Visual Studio で 3 つの DLL ファイルを選択し、右クリック -> プロパティを選択します。Build Action が「None」に設定され、Copy to Output Directory が「Do not copy」に設定されていることを確認してください。ここで、別のビルド後のイベントを追加して、これらがデバッグ用に適切にコピーされるようにする (つまり、ルートにコピーされて、CEF dll およびプロジェクト exe と一緒に配置されるようにする) 必要があります。

  • プロジェクトを右クリックし、[プロパティ] -> [ビルド イベント] を選択し、CEF の他の xcopy コマンドの直後に、「ビルド後のイベント コマンド ライン」に次のように入力します。

    xcopy "$(ProjectDir)Lib\Microsoft.VC110.CRT*.*" "$(TargetDir)" /s /y /i

この時点で、すべてが構築されているはずです。ClickOnce でアプリを公開するには、すべての CEF DLL をプッシュするだけでなく、クロム開発ツールに必要なファイル/フォルダーが存在することを確認する必要があります。開発ツールまたはすべての DLL が必要ない場合は、それに応じてこれを微調整できます。

CEF および C++ ランタイム ファイルが ClickOnce で確実にデプロイされるようにする

  • Visual Studio でプロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。

  • 右クリックして選択し、csproj ファイルを編集します。

  • 終了</Project>タグの前にこれを追加します

    <ItemGroup>
       <Content Include="$(SolutionDir)packages\CefSharp.Wpf.1.25.7\cef\**\*">
         <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
         <Visible>false</Visible>
      </Content>
    </ItemGroup>
    
    <ItemGroup>
       <Content Include="$(ProjectDir)Lib\Microsoft.VC110.CRT\**\*">
          <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
          <Visible>false</Visible>
      </Content>
    </ItemGroup>
    
  • これにより、cef フォルダーのすべてがプロジェクトに追加され、展開時に C++ バイナリがプロジェクトのルートにコピーされるようになります。CEF の場合\**\*、インクルードの最後に構文を使用して、%(RecursiveDir)すべてのファイルがコピーされ、localesその内容と構造が保持されたフォルダーがコピーされるようにします。設定<Visible>false</Visible>すると、ソリューション エクスプローラーにアイテムが表示されなくなります。

リラックス

アプリを公開すると、必要なすべてのファイルとフォルダーがコピーされます。

于 2014-06-18T14:08:40.813 に答える
1

これに対する Barrie の回答のおかげで、とても助かりました。以下の彼の回答を使用していますが、Visual Studio 2015 を使用して最新の CEF で動作するように更新しています。

注: x86 プラットフォームのみをビルド/ターゲットにしています。必要に応じて、以下のコピー コマンドで x64 を変更または含める必要がある場合があります。

CefSharp のインストール

  • NuGet を使用して CefSharp.Wpf をインストールします (v51.0.0 を使用しています)。

    インストール後の NuGet ライブラリ

  • これにより、関連するファイルが配置されます

    $(SolutionDir)packages\CefSharp.Wpf.51.0.0\CefSharp (CefSharp.Wpf) $(SolutionDir)packages\CefSharp.Common.51.0.0\CefSharp (CefSharp.Common) $(SolutionDir)packages\cef.redist. x86.3.2704.1432\CEF (Cef x86 再配布) $(SolutionDir)packages\cef.redist.x64.3.2704.1432\CEF (Cef x64 再配布)

ビルドの構成

  • CefSharp DLL をビルド フォルダーにコピーするには... CefSharp の新しいバージョンでは、これはもう必要ないと思います。Click-Once で出荷するために、「ビルド後のイベントのコマンドライン」xcopy などは必要ないことがわかりました。(もちろん、DevTools も機能します!)

Visual C++ 2012 ランタイム ファイルの処理

  • (VCR 2013 に切り替え) ユーザーが展開の一部として Visual C++ 2013 ランタイム ファイル全体をダウンロードする必要がないようにしたかったので、Visual Studio を使用してフォルダー lib\Microsoft.VC120.CRT を追加し、3 つの DLL を追加します。 (msvcp110.dll、msvcr110.dll、vccorlib110.dll) を、コンピューター上の次のフォルダーから、プロジェクトで作成したばかりのフォルダーにコピーします。

    C:\Windows\SysWOW64

    (C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist には表示されませんでした)

この時点で、すべてが構築されているはずです。ClickOnce でアプリを公開するには、すべての CEF DLL をプッシュする必要があります。それに応じてこれを微調整できます...

CEF および C++ ランタイム ファイルが ClickOnce で確実にデプロイされるようにする

  • Visual Studio でプロジェクトを右クリックし、[プロジェクトのアンロード] を選択します。
  • 右クリックして選択し、csproj ファイルを編集します。
  • 終了タグの前に次を追加します。

    <!--  BEGIN: CUSTOM ITEM GROUP INCLUDES INTO THE PROJECT (SO CLICK-ONCE PUBLISHES THEM) -->
    <ItemGroup>
            <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\*" Exclude="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\x86\**\*;$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\locales\**\*.pak">
                    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
                    <Visible>false</Visible>
            </Content>
    </ItemGroup>
    <ItemGroup>
            <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\en-GB.*;$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\**\en-US.*">
                    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
                    <Visible>false</Visible>
            </Content>
    </ItemGroup>
    <ItemGroup>
            <Content Include="$(SolutionDir)packages\cef.redist.x86.3.2704.1432\CEF\x86\**\*">
            <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
            <Visible>false</Visible>
            </Content>
    </ItemGroup>
    <ItemGroup>
            <Content Include="$(SolutionDir)packages\CefSharp.Common.51.0.0\CefSharp\x86\**\CefSharp.BrowserSubprocess.*">
                    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
                    <Visible>false</Visible>
            </Content>
    </ItemGroup>
    <ItemGroup>
            <Content Include="$(ProjectDir)lib\Microsoft.VC120.CRT\**\*">
                    <Link>%(Filename)%(Extension)</Link>
                    <Visible>false</Visible>
            </Content>
    </ItemGroup>
    <!--  END: CUSTOM ITEM GROUP INCLUDES INTO THE PROJECT (SO CLICK-ONCE PUBLISHES THEM) -->
    
  • これにより、cef フォルダーのすべてがプロジェクトに追加され、展開時に C++ バイナリがプロジェクトのルートにコピーされるようになります。false に設定すると、ソリューション エクスプローラーにアイテムが表示されなくなります。

  • 注意: 私は x86 プラットフォームのみをビルド/ターゲットにしています。必要に応じて、以下のコピー コマンドで x64 を変更または含める必要がある場合があります。

公開

アプリを公開すると、必要なすべてのファイルとフォルダーがコピーされます。


(追加情報) 古いオペレーティング システムのサポート情報は以下のとおりです。

古いマシン (XP および Vista) で CefSharp を使用する必要がある場合は、古い v47.0.0 バージョンを使用して NuGet から CefSharp.Wpf をインストールし、.NET ターゲットを .NET 4.0 クライアント プロファイルに変更します。

Chromium は 2016 年 4 月に XP と Vista のサポートを終了しましたが、CefSharp バージョン 47 (またはその周辺) はまだサポートされていました。

XPの問題と修正に関する別のメモ:

XP の展開には Chromium の問題があります。以下は、JBCB の修正プログラムを展開するための手順に続いて、修正プログラムを説明する記事です。

記事へのリンクは次のとおりです: https://bitbucket.org/chromiumembedded/cef/issues/1787

...その中に、「dbghelp.dll」をダウンロードするための参照が表示されます。ダウンロードして解凍します。


以下のようなインストール後のアプローチを取るか、他の公開ファイルと一緒に DLL を含めることを選択できます。私は余分な DLL を展開せず、XP マシンにのみ手動で展開することを選択しています (数台しかありません)。


XP マシンでの展開を修正するには、次の手順を実行します。

  1. XP マシンに CefSharp ブラウザをインストールします (Click-Once 経由)。
  2. 「dbghelp.dll」をコピーします
  3. XPマシンのローカルインストールディレクトリに貼り付けます(前のリンクの指示に従って:「libcef.dll」ファイルと一緒に)。

注: クリック ワンス インストールの場合、次の場所の下のサブフォルダーにあります。

C:\Documents and Settings\<UserName>\Local Settings\Apps\2.0\<auto-gen ostificated ID>
于 2016-10-29T15:31:16.970 に答える
1

疑わしい dll を手動で追加しようとしても、まだ機能しないので、次に私が行うことは、fusion を実行して、実際に何が不満なのか、つまり、読み込めない依存関係が正確に何であるかを確認することです。これらのタイプのエラーを追跡する方法に関する優れたチュートリアルを次に示します。

基本に戻る: Fusion Log Viewer を使用して不明瞭なローダー エラーをデバッグする

于 2014-04-03T16:54:56.423 に答える
1

あなたは私のために同様の問題を解決したこれを試すことができます:

.NET ライブラリではない DLL をファイルとしてソリューションに追加します。

Right click project > Add > Existing Item

次に、ビルド アクションをコンテンツに設定し、[出力ディレクトリにコピー] を [常にコピー] に設定します。

そうすれば、ライブラリが出力ディレクトリに含まれます。

于 2014-04-03T16:06:47.430 に答える
0

CefSharp の依存関係の公式リストを注意深く読んでください- それらはたくさんあります! どうにかして、それらすべてを ClickOnce bin フォルダーに入れる必要があります。

これが私がそれを解決した方法です:

  • 配置する前に、 Visual C++ Redistributableの最新バージョンをインストールします。展開先の各 PC で (グループ ポリシーを使用するか、手動で)。
  • 空のテスト プロジェクトから始めます。
  • CefSharpCefSharp.Coreなどへのプロジェクト参照を追加します。
  • 各依存関係をプロジェクト ディレクトリ内の 1 つのフォルダーに追加して、それらを整理します ( Files\CefSharp\)。
  • すべてのファイルがBuild Action: Content、および で構成されていることを確認しますCopy to Output Dir: Copy always
  • Initalise_CefSharpFiles()ファイル/フォルダーを bin ルート フォルダー (CefSharp が検索する場所) にコピーする関数を作成します。たとえば、 from: Bin\Files\CefSharp\*to: をコピーしますBin\*
  • 最後に、実行時にInitalise_CefSharpFiles()、アプリの読み込み後、CefSharp の設定を初期化する前に 1 回呼び出します。
于 2018-12-12T03:56:29.990 に答える