7

一連のバイナリ依存関係を持つプロジェクトがあります(ソースコードがないアセンブリdll)。実行時には、これらの依存関係はマシンにプリインストールされている必要があり、コンパイル時には、ソースツリー(libフォルダーなど)に必要です。このプログラムのソースコードも利用できるようにしているので、簡単なダウンロードとビルドエクスペリエンスを有効にしたいと思います。残念ながら、私はdllを再配布できません。これは、VSが参照されたdllにアクセスせずにプロジェクトをリンクしないため、事態を複雑にします。

実際に参照されているdllがない場合でも、このプロジェクトをビルドしてリンクできるようにする方法はありますか?

たぶん、VSにdllの自動生成されたスタブに対してリンクするように指示する方法があります。そうすれば、元のスタブなしで再構築できますか?多分これを行うサードパーティのツールがありますか?この分野での手がかりやベストプラクティスはありますか?

コードを実行するには、その人がdllにアクセスできる必要があることを理解しているので、ビルドプロセスにそれらを追加できることは理にかなっていますが、すべてのdllを収集して配置する手間を省こうとしています。 libフォルダを手動で。

4

5 に答える 5

2

上記のすべての良いアドバイスに同意しました。そうは言っても、外部DLLが一般的に必要とされない有効なシナリオがあるのではないでしょうか。だからここにあなたがすることです。それらをラップして分離します。(インターフェイスを作成するよりも抽象化のレベルが高いため、保守が少し簡単です)。

Visual Studioでは、外部DLLを参照する特定のVSプロジェクトを再コンパイルしない場合、それらのDLLを手元に用意しなくても、残りのVSソリューションのプロジェクトをコンパイルする必要があります。したがって、何らかの方法で外部DLLを独自のDLLでラップし、それらのラッパーをバイナリのみとして配布する場合、ソースコードを共有する人は、メインソリューションをコンパイルするために外部DLLを必要としません。

考慮事項:1。ラッパーコードを分離されたプロジェクトに分離するための追加作業。2.他のVSプロジェクトは、ラッパーDLLへの参照を、「プロジェクト参照」ではなく「LIB」フォルダーへの「ファイルシステム」参照として追加する必要があります。3. VSソリューション構成では、ラッパーDLLのコンパイルを無効にする必要があります。必要に応じて、それらを明示的に再コンパイルするために、新しい構成を追加する必要があります。4.各ラッパーDLLのVSプロジェクト定義には、ビルド後のイベントを含めて、予想される「LIB」フォルダーの場所にコピーする必要があります。5.実行時に、外部DLLはアプリケーションのbinディレクトリまたはマシンのGACに存在するか、明示的にロードされている必要があります。注:それらが欠落している場合、それらが欠落していると実行時エラーが発生するのは、実行時に実際に呼び出されたときのみです。すなわち 一般的な状況でコードがそれらを呼び出さない場合は、それらを持っている必要はありません。6.実行時に、外部DLLのロードエラーをキャッチし、「この関数を使用するには、次の製品をインストールしてください:xyz」というかなりのエラーメッセージをユーザーに表示できます。「AssemblyLoadException...FusionLogViewerを使用してください...など」を表示するよりも優れています。7。アプリケーションの起動時に、不足しているDLLをテストおよび検出し、それらに依存する特定の機能を無効にすることができます。

例:このパターンによれば、Microsoft CRMおよびSAPと統合するアプリケーションを作成できますが、特定の機能、つまりインポート/エクスポートのみを対象としています。
設計時に、開発者がラッパーを変更する必要がない場合は、これらの外部DLLがなくても再コンパイルできます。実行時に、ユーザーがこの関数を呼び出さない場合、アプリケーションはラッパーを呼び出さないため、外部DLLは必要ありません。

于 2010-03-16T16:14:00.817 に答える
2

たぶん、これらのアイデアの1つは、問題の解決に役立ちます。

  • サードパーティのdllのすべてのクラスからインターフェイスを取得します。これらのインターフェイスを独自のプロジェクト(同じソリューション)に配置し、このインターフェイスアセンブリへの参照を追加します。また、EventHandlerをAppDomain.AssemblyResolveに追加し、実行時にアセンブリを見つけてロードしてみてください。(クレジットはNGになります)
    • dllの大きさや、パブリック部分に変更が加えられる頻度によっては、これは非常に苦痛になる可能性があります。
  • 必要なアセンブリを取得する方法と、プロジェクトパスに対してユーザーがアセンブリを配置する場所を説明するreadme.txtを提供します。通常、VSは、アセンブリを適切な場所に配置した直後に感嘆符を削除できるほど賢く、プロジェクトが感嘆符を参照します(ソリューションエクスプローラーで更新を押す必要がある場合があります)(クレジットはPaulに移動します)
    • ソリューションを右クリックして[追加]->[既存のアイテム]を選択して、readme.txtもソリューションに追加することを忘れないでください。この場合、Visual Studio Solution Explorer内で非常に目立つ場所になり、ユーザーはダブルクリックで読むことができます。
  • ソリューション内に、必要なすべてのdllを自動的にダウンロードして適切な場所に配置できる別のプロジェクトを作成します。たぶん、ダウンロードを開始する前に、これらの必要なファイルがすでに存在するかどうかを事前に確認する必要があります。元のプロジェクトのプロジェクト依存関係を設定して、これに依存するようにします。したがって、常に元のビルドよりも前にビルドされます。次に、元のプロジェクトのビルド前イベントでこのダウンロードヘルパーツールを開始し、int値を使用してプログラムを終了することを忘れないでください。0は成功、その他のエラーを意味します。したがって、Visual Studioはツールが成功したかどうかを認識し、不足しているdllにぶら下がる前にコンパイルプロセスを停止します。
    • おそらく、ファイルを自動的にダウンロードすることはほぼ不可能です。Webページにログインする必要があるか、ツールで自動化できないCookie、フラッシュ、キャプチャなどが使用されているためです。
于 2010-03-16T10:07:39.483 に答える
0

すべてのアセンブリを収集する手間を省き、自分でlibフォルダーに配置します。次に、リポジトリ内のソースコードとともにそれらをコミットします。このようにして、リポジトリからコードをチェックアウトする人々は、プロジェクトをコンパイルするために必要なすべてのものも取得します。

于 2010-03-16T08:47:46.430 に答える
0

かなり劇的な可能性は、分離されたインターフェースパターンを使用し、実行時にプログラムでdllをロードすることです。

于 2010-03-16T08:52:13.830 に答える
0

追跡に時間がかかる可能性のあるランタイムエラーよりも、コンパイル時の依存関係でビルドが失敗するようにしたいと思います。

ソリューションにReadme.txtを配置し、依存関係とは何か、それらを取得する場所、およびそれらをどのように処理するかを明確に説明します。

于 2010-03-16T09:07:33.800 に答える