2012-03-04 24 views
5

.NET 4とVS2010を使用していくつかのモデルを設定したEntity Frameworkプロジェクトがあります。次に、このエンティティプロジェクトを使用する必要があるいくつかのプロジェクトがあります。 EFプロジェクトをDLLにコンパイルしました。また、EF dllのリファレンスを複数のプロジェクトに追加しています。複数のプロジェクトにまたがるEntity Frameworkライブラリの共有

問題は、このEF dllを参照するいくつかのプログラム(ASP.NETとコンソールアプリケーション)があり、dllが呼び出しプログラムごとにローカルにコピーされていることです.EF dllを変更すると、それぞれのプロジェクトに入り、EF dllを新しいビルドに置き換えます。

私は、複数のプロジェクトにまたがってライブラリやEFプロジェクトを共有することをたくさん探しました。私がいくつかを見つけている間、私は自分の状況に合わせて仕事をすることができ、それは無関係ではないほど良い例を見つけることができないようです。

これは一般的な問題です。私が直面している問題をよりよく理解するために、私は特定のプロジェクトに焦点を当てます。これは、イントラネット用のASP.NET Webフォームプロジェクトです。 EF dll参照を追加し、プロジェクトがローカルでdllをコピーできるようにすると、EFはうまく動作します。しかし、私たちは複数のプロジェクトを持っているので、今ではEF dllを複数のプロセスで共有できるどこかで集中させてみる必要があります。私はこれを設定しようとしていないので、1つのEF dllが複数のサーバーにまたがってアクセスされます。必要に応じて、個々のサーバーにDLLのコピーをインストールして嬉しいです。

私の望むのは、各サーバーに "common libraries"ディレクトリ(簡略化した例 "C:\ OurLibraries")を作成することです。次に、このフォルダにEF dll(およびおそらく他のもの)を置いて、さまざまなプログラム/プロセスがEF dllの共通コピーにアクセスできるようにします。 EF dllの「ローカルコピー」がイントラネットプロジェクトから削除され、「C:\ OurLibraries \ OurEF.dll」ファイルへの参照が追加されていることを確認しました。

"タイプ 'EntityNS.ProductDBEntity'を読み込めませんでした。"というエラーメッセージが表示され、エラーメッセージが表示されるまで、イントラネットプロジェクトは正常に動作します。

参照で「ローカルコピー」をオンにすると、イントラネットサイトが再び正常に動作します。私はEF dllを共有できるような魔法の設定を見つけることができないようです。

私は様々な記事をもとに次のことを試してみましたが、ありません成功しています

  • は、アセンブリに署名し、GACに追加します。

  • "C:\ OurLibraries"ディレクトリをPATH環境変数に追加すると、同じ問題が発生しました。 /Ecomedate.csdl|res:///Ecomedate.ssdl|res:///Ecomedate:

  • は「ORの」文字列からを削除するには、私のイントラネットのweb.configファイルでEFのための私の接続文字列を変更します

    は、私がこれと検索フォーラムに取り組んで多くの時間を費やしてきた:.msl;プロバイダ=システム... にプロバイダ=システムは...

Sharing Entity framework objects across projects?このポストに基づきます)と投稿します。私はこれを行う方法がなければならないことを知っていますが、コードの再利用とDLLの共有は役に立たないようです。

私が作った追加の努力とこれまでの投稿に対するいくつかの回答があります。

これまでGACで経験したことがあります。 - VS2010がインストールされているコンピュータでは、gacutilはC:\ Program Files \ Microsoft SDK ...にあります。フォーラムでは「どこでgacutilがありますか?」という一般的なトーンは、gacutilが開発ツール優れた環境での使用を意図しています。 Gacutilをは、Server 2008のまたは.NET 4のフレームワークの一部ではないので、展開、およびGACに対処する方法にはいくつかの提案があり

  • ます。gacutilを使用して、インストールの古い方法は、まず、しかしによってDLLですプロダクションサーバーでpsexecを使用してgacutilをコピーして呼び出す私はpsexecをローカルのdevboxからプロダクトサーバに実行し、0の戻りコードを得ることができますが、gacutilがないので、プロダクションサーバにインストールされていることを実際に見る方法は見つけられませんプロダクトサーバでは、gacutil/l DataEntity.dllのようなsometingを使用して、インストールされたdllの情報を表示することはできません。
  • gacutil.exeとgacutil.exe.configファイルを運用サーバーにコピーして試してみました。プログラムが実行され、gacutilのバージョン番号が与えられている間は、gacutil.exe/i DataEntity.dllやgacutil.exe/l DataEntityなどのコマンドラインスイッチには応答しません。 gacutilのバージョン情報を表示して停止します。
  • 誰かがprodマシンにMicrosoft SDKをインストールするためのフォーラムに参加しました。これまでのところ成功していないためにこれを検討しなければならないかもしれませんが、実際の環境にSDKをインストールすることは本当に嫌いです。
  • 私はRemote GAC Managerなどのツールを見たり、管理したりしようとしましたが、そのオープンソースプロジェクトの最後の開発は2008年なので、GACを見てみると、 \ Windows \ assembly gac dllsですが、.NET 4は現在GAC dllを格納するためにC:\ windows \ Microsoft.NET \ assemblyを使用していますので、リモートプロダクションサーバのgac上でDLLを表示または管理する手段を見つけることができます。コマンドプロンプトでc:\ windowsにdir DataEntity.dll/sコマンドを実行すると、C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSILディレクトリに埋め込まれたdllが見つかりますが、 C:\ Windows \ Microsoft \ assembly \ GAC_MSILのエクスプローラでファイルを検索すると、DLLが表示されないので、C:\ Windows \ MicrosoftのDLLを管理(インストール、一覧表示、アンインストール)できるツールが見つかりません。 .NET \ assembly \ GAC_MSILに移動します。
  • ドラッグアンドドロップでgacにdllをインストールする方法がありました。私は展開プロセスを自動化しようとしているので、手動でドラッグ&ドロップすることは意味がありません。 C:\ Windows \ Microsoft.NET \ assembly \ GAC_MSILディレクトリへのコピーも機能しますか?私はそれを試しましたが、私はそれが働いているかどうかわからないインストールされた/登録されたDLLを見ることができるツールを見つけることができないので、再び。
  • 別の提案は、GACにインストールするだけのインストーラを作成することでした。私はこの方法を試み、いくつかの問題に遭遇しました。最初は非常に手作業でした。私はGACから古いdllをアンインストールしてgacに新しいバージョンのDLLをインストールする方法を理解できませんでした。以前のインストールを最初にアンインストールすることを主張し続けました。第二に、DLLをアンインストールしようとしたときに、別のアプリケーションで使用されていたと言いました。私は再起動してアンインストールしてみましたが、行っていません。私は最終的にそれがIISであることを理解し、IISをシャットダウンし、アンインストールし、再起動し、インストールしてからIISを再起動する必要がありました。これは痛みですが、試して自動化することです。

共有ディレクトリに本番環境へのDLLを展開するためのより良い方法があるはずのように思えます。私は単にDataEntityを試してみたいと思っています。dllをc:¥MyLibrariesディレクトリにコピーし、そのプロセスがその1つのDLLのコピーにアクセスできるようにします。マイクロソフトではC:\ Program Files \ Common Filesを使用しているため、可能であるはずですが、GACまたはインストーラオプションによって課せられたメンテナンスの労力を軽減する方法を見つけようと努力しました。重複したdllの数、および 'ローカルにコピーする'ことが許可されている場合は、dllの置き換えを見落とさないようにします。

+0

私はあなたがやろうとしているものやったことがないが、私はアプリケーションプールのユーザープロファイルをロードしてみてください、そして、それは「C:\ OurLibraries」へのアクセス権を持っていることを確認したいディレクトリ。または、すでに試しましたか? –

+1

なぜ、各プロジェクトに独自のローカルコピーがあるのはなぜですか? dllが変更された場合は、とにかく再構築する必要があるかもしれません。そのため、アプリケーションを更新する必要があるときに(IMHO)バージョニングの苦労の外に、集中して得られるものは分かりません。 –

答えて

1

Web Servicesこの目的のために.webサービスが作成されています。あなたはWCFサービスライブラリを構築して、すべてのプロジェクトでそのメソッドを使用できます。

グッドラック

+0

以前はWebサービスを行っていましたが、これはEntity Frameworkソリューションではどれくらいうまく機能していますか?選択、更新などのたびにメソッドを作成する必要はありませんか? LINQステートメントを使用してデータレイヤーとやりとりできるなど、EFの目的と矛盾するようです。 – bbrown127

+1

私はすべてのアプリケーションで1つのEFデータモデルを使用しているため、これらの80〜90%のすべての要件が同等であり、これらのメソッドを一度にすべて開発すると思います。すべてのアプリケーションのための残りの要件のために独自のメソッドを開発する必要があります。これらの実装方法はメンテナンスのコストを削減します。 – Arian

0

GACのアプローチは、おそらくあなたが探しているものに近いものです。 GACを稼働させることができなかったので、GACにインストールするための指示に従っていることを再度確認する必要があります。

+0

私はGACに行くことができると思いますが、はるかに簡単な方法があるはずです。 GACに見られる問題は、開発環境では問題なく動作しますが、プロダクションに展開するときは、リモートサーバーに展開するのが非常にスムーズなプロセスではないようです。 GACUtilは、私が読んだSDKからしか入手できない開発ツールと見なされるため、Windows Serverにはインストールされません。私は展開するいくつかのpsexecを使いこなしましたが、そこには展開されたDLLを表示して維持するための簡単な方法はありません – bbrown127

+0

もっと簡単な方法があれば、Microsoft自身がそれを使用しています。代わりに、MVCのdllをbin \ deployし、ReportViewerのdllをインストールしているGACが表示されます。彼らはアセンブリの読み込みを設計したときに、アンマネージド/ COMアプリケーションに悩まされていた古い "DLL地獄"のような問題を避けるために、いくつかのトレードオフを行った。 –

+0

さて、私は簡単な方法で推測します。私はC:\ ProgramFiles \ CommonFilesの例を参照しています。 Officeプログラムと他のMSプログラムとの間で一般的に使用されるたくさんのDLLがここにあります。彼らはこのメソッドを使用しているように見えます。 – bbrown127

0

(これは解決策として、「外が」きれいに見えるかもしれませんが、我々は、リモート・複数のサーバーに公開、Gitのリポジトリが最新のDLLにコミットされますを行うにはGitのリポジトリを使用して検討していますDLLのみ)、各プロダクションサーバ/アプリケーションサーバにプッシュされます。

関連する問題