0

次を使用して、Googleで回答を検索しました。

「タイプ 'Microsoft.SqlServer.Management.Smo.Server' は、参照されていないアセンブリで定義されています。」

DAL で Microsoft Sql Server Management Objects (SMO) を使用すると、参照されるプロジェクトで SMO dll への参照が必要になるのはなぜですか?

参照プロジェクトでの sql smo の使用

階層化されたソリューションでの sql smo

SQL SMO 参照要件

おそらく他にもいくつかあり、この問題の解決策や説明は見つかりませんでした。

確かに、私はジャーニーマン グーグルなので、もし誰かが私をパワーレベルアップして既存のリソースへの道を示したいと思ったら、喜んでそこから探検に行きます。

これが私のセットアップです:

DAL、ビジネス ロジック、サービス、UI という階層化されたソリューションがあります。サービスをホストする hosts プロジェクトがあります。私は実際に VS2010 拡張機能layerguidance.codeplex.comを使用しています。これは非常に優れており、これらすべてのプロジェクトをセットアップしています。SQL Server 2008 Express と SMO v 10 を使用しています。すべてのソリューション プロジェクトは、プロジェクト参照を使用して参照されます。すべてのプロジェクトは、共通の最上位の Bin フォルダーにコンパイルされます。

今問題:

DAL のクラスの中には、SmoTasksSMO オブジェクトとのインターフェイスを処理するクラスと、パラメーターに SMO オブジェクトを必要とせずに関数Utilitiesから抽象化してその関数へのアクセスを提供するクラスがあるため、参照プロジェクト (読み取り: ビジネス ロジック レイヤー) は、SmoTasks非 SMO タイプ。DAL ではすべて問題なく、コンパイルも問題なく行われ、メソッドはテストに合格しています。私の世界での位置については満足しています。次に、BLL には、Utilitiesクラスを使用してサービスを介して公開されるアプリケーションのデータベース構成を実行するコンポーネントがあります。BLL は DAL へのプロジェクト参照を使用し、期待どおりに DAL クラス (インテリセンス) を認識します。ただし、コンパイルすると、次のようになります。

タイプ 'Microsoft.SqlServer.Management.Smo.Server' は、参照されていないアセンブリで定義されています。アセンブリ 'Microsoft.SqlServer.Smo, Version=10.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' への参照を追加する必要があります。

BLL のコードは次のようになります。

 public bool CreateTables(string connectionString)
    {

        bool result = default(bool);


        // Data access component declarations.
        Utilities utilities = new Utilities();

        // Step 1 - Calling CreateTables on Utilities.
        result = utilities.CreateTables(connectionString);

        return result;

    }

エラーが指す行は次のとおりです。

result = utilities.CreateTables(connectionString);

もちろん、SMO 参照を BLL に追加すれば、BLL は問題なく動作しますが、それは疎結合プロジェクトという私の設計目標に反します。SMO アセンブリを BLL に追加すると、コンパイルされ、サービス層で BLL オブジェクトを参照しても問題は発生しません。私の質問は、なぜですか?より具体的には、DALのクラスが既に SMO 型を抽象化しているのに、BLL が SMO への参照を必要とするのはなぜですか?Utilities

私が欲しいのは、DAL でのライブに関連するすべてのデータベース (duh) と、BLL のビジネス ロジックのみ (double duh) です。 私が見落としていた SMO を使用してこれを達成する別の方法はありますか?

貴重なお時間とご回答ありがとうございます。返信をお待ちしております。

編集: Chris の提案に基づいてソリューションを調整し、プロジェクト参照 (私) を使用していることを確認し、Muse.VSExtensions を使用して DAL 内の SMO への参照を再追加し、GAC 参照を追加しました。手動で追加してから、それらのアセンブリが存在することを二重に確認するために、それらのアセンブリに対して Copy Local = True を設定しました...しかし、私はまだこの厄介なコンパイルエラーに悩まされています。

4

2 に答える 2

1

これは、ソリューションで物事がどのように参照されているかに要約されると思います。そこで、いくつか推測してみます。

DLL が DAL をプロジェクト参照ではなくアセンブリとして参照しているようです。

コンパイル時に、Visual Studio は、必要と思われるすべてのものをプロジェクトの BIN ディレクトリにコピーします。外部 DLL (DAL) を参照すると、その DLLはBLL の BIN ディレクトリに のみコピーされます。

必要なのは、SMO アセンブリもコピーするか、GAC を通じてそれらの SMO アセンブリを使用できるようにすることです。個人的には、GAC が好きではないので、無視します。

これには 3 つの方法があります。最も簡単な方法は、他のアセンブリへの参照を BLL に追加することです。明らかに、それはあなたが望むものではありません。

2 つ目の方法は、DAL プロジェクトをプロジェクト参照として参照することです。これにより、Visual Studio が余分な依存関係を検出し、それに応じてコピーできるようになります。これもまさにあなたが望むものではありません。

3 番目の方法は、ビルド ステップの一部としてそれらをコピーすることです。BLL プロジェクトを右クリックし、[ビルド イベント] に移動します。ビルド前イベントのコマンド ラインで、コマンドを入力して、必要な SMO ファイルを BLL プロジェクトの BIN ディレクトリにコピーします。

メインのサービス プロジェクトについても、これを再度行う必要があります。

于 2012-01-25T22:01:15.600 に答える