質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

854閲覧

提供先アプリとの外部ライブラリの参照設定バージョン違い

JanTh1989

総合スコア87

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2019/02/22 14:39

編集2019/02/23 22:46

94### 前提・実現したいこと
<前提>
アプリケーション→ライブラリ→元データ(データ種類はXMLやCSVなど複数)という流れのうち、ライブラリの開発をしています。
このライブラリでは、元データから必要データを抽出し、Json形式に再編成して、アプリケーション側に提供するという流れの動作を行います。
ライブラリはインタフェースDLL、元データ種類別に編集を行うパーツDLL、インターフェースDLLおよびパーツDLLが使用する外部ファイル、外部ライブラリなどを保持するフォルダ単位で提供します。
アプリケーション側は、exeファイルと同階層にフォルダを配置して使用、という形になります。
アプリケーション側では、app.configのprobingタグのprivatePath属性にライブラリのフォルダ情報を入れ、機能させていました。
例)
Sample
├Interface.dll
├Parts
│ └Parts.dll
└Lib
" └外部ライブラリ.dll

<実現したいこと>
ライブラリもアプリケーションも、共にJsonを使用するにあたって、Newtonsoft.Jsonを参照設定して使用します。
このNewtonsoft.Jsonの読み込み先ファイルをライブラリとアプリケーションで、それぞれ別にしたいです。

発生している問題・エラーメッセージ

<発生している問題>
app.configのprobingタグのprivatePath属性使用のままでは、最新のDLLをライブラリのフォルダ(例だとLibフォルダ)に持たせる必要がでてきます。
また、それをしたとしても、privatePath属性では、先に見つけたアセンブリを読み込もうとするため、ライブラリ、アプリケーションのアセンブリバージョンが異なれば、いずれかでFileLoadExceptionが発生します。

該当のソースコード

・C#

試したこと

①app.configのcodeBaseタグを用いてアプリケーションおよびライブラリが使用する外部ライブラリの情報を全て記載。
この方法は正常動作させることはできましたが、今後ライブラリの追加パーツDLLなどで外部ライブラリが追加になった場合、アセンブリ名、バージョン情報、ファイルパスなどをアプリケーション側に伝え、かつapp.configにcodeBaseを追加してもらう必要が出る。
②リフレクション(System.Refrection)により、静的参照をやめ、ファイルパス指定で動的参照に変更。
こちらも正常動作はするが、修正に伴う影響範囲が広い。
また、処理数増加に伴う可読性低下なども危惧される。
極力、ライブラリ側も参照設定での読み込みを維持したい。

補足情報(FW/ツールのバージョンなど)

<開発環境>
・.Net Framework 4.5
・Visual Studio 2015
<その他補足>
COMやWCFなどで、呼び出し元のアプリケーションとは完全別個にすれば可能ではないか、という案が挙がっています。
こちらは動作未確認です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

アプリケーションが読み込んでいる外部ライブラリをそのままライブラリ側でも使えばいいんじゃないでしょうか。
AppDomain から列挙してみてください。

投稿2019/02/22 15:10

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2019/02/22 22:45

ご回答ありがとうございます。 AppDomainから列挙というのがいまひとつよくわかりませんでした。 すみません。 その方法は、アプリケーションと共有化したいもの以外(元データ編集用の外部ライブラリなど)はライブラリ環境から使用など、切り分けができるものなのでしょうか? AppDomain依存となりますと、アプリケーション側が参照しているもの以外を、ライブラリ側は参照できなくなるのではないかと思っています。 ※質問内容への補足になりますが、ライブラリはアプリケーション環境(exe)と同階層に配置して使用する単一のDLLではなく、ライブラリ動作のパーツとなるDLLや外部ライブラリのDLLなどもあるフォルダ単位での提供品になります。
Zuishin

2019/02/23 02:40

動的参照になります。バージョンの違いで競合が起こるなら、別のものを参照したのではデータの受け渡しはできませんから。 AppDomain.Default.GetAssemblies().GetTypes() で実行時に使用可能な型を列挙できます。それをリフレクションや dynamic で使用するということです。
JanTh1989

2019/02/23 03:17

なるほどです。 アプリケーションと同じアセンブリ名のものは、AppDomainから同バージョンで使用するって流れですかね? ライブラリのみ使用のものは、例で挙げたLibフォルダに置いて、これまで通りにapp.configのprobingタグのprivatePath属性で静的参照、みたいな構図を考えていますがどうでしょう?
Zuishin

2019/02/23 04:53

それでやってみてください。もしそれでできなければアプリに手を入れる必要があるかもしれません。
Zuishin

2019/02/23 05:03

質問が編集されているのに今気づきましたが、Json でアプリに渡す手が使えるならそれも手だと思いますし、それもダメでリフレクションもダメなら、アプリに手を入れるかアプリの使用する外部ライブラリに合わせて複数バージョン配布するくらいしか現実的な方法は思いつきません。
JanTh1989

2019/02/23 22:54

一旦その方向で検討してみます。 ネックになりそうなのは、ライブラリ側でのみ現状使う予定のもので参照設定していたものを、アプリ側も使いたくなったときに動的参照に切り替えないといかなくなる部分ですかね・・・。 (多分log4netとか) 事前すり合わせなどが必要になってきそうな面が多々出てきそうですが、進めてみます。 補足で書いているCOMやWCFなんかは、プロセスが別になるあたりが、アプリ側に提供する部品という名目から鑑みると今一つ感がぬぐえませんし。 長々とありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問