- PR -

クラスライブラリのアセンブリ参照について

1
投稿者投稿内容
EIS
会議室デビュー日: 2003/11/23
投稿数: 6
投稿日時: 2007-08-23 01:38
クラスライブラリ内で使用するアセンブリの参照設定につき、
ご教授いただきたく。よろしくお願いします。

現在、ユーザのパラメータの指定により参照先のDBを切り替える
クラスライブラリを作成しています。
VS2005でC#を使用。
対応するDBは、Oracle、MySQL。
それぞれODP.NET、Connector/Netを使用してデータアクセスを行います。

以下、ソースの抜粋です。
コード:

// データアクセスで使用するオブジェクト群を
// 生成するファクトリクラス
public abstract class DbFactory
{
public enum DbType
{
Oracle,
MySQL
}

public static DbFactory GetFactory(DbType type)
{
switch (type)
{
case DbType.Oracle:
return new OracleFactory();
case DbType.MySQL:
return new MySQLFactory();
}
}

public abstract DbConnection CreateConnection();
public abstract DbCommand CreateCommand();
public abstract DbDataAdapter CreateDataAdapter();
}

// Oracle関連のオブジェクト群を生成するファクトリクラス
public class OracleFactory : DbFactory
{
public DbConnection CreateConnection()
{
return new OracleConnection();
}
public DbCommand CreateCommand()
{
return new OracleCommand();
}
public DbDataAdapter CreateDataAdapter()
{
return new OracleDataAdapter();
}
}

// データアクセス処理
public class DbAccess
{
public void GetTable1(DbFactory.DbType type)
{
DbFactory factory =
DbFactory.GetFactory(type);
DbConnection conn = factory.CreateConnection();
conn.ConnectionString = "connectionstring";
conn.Open();

DbCommand cmd = factory.CreateCommand();
cmd.CommandType = CommandType.Text;
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM TABLE1";

DbDataAdapter adapter = factory.CreateDataAdapter();
adapter.SelectCommand = cmd;

DataSet ds = new DataSet();
adapter.Fill(ds);

conn.Close();
}
}



クラスライブラリのプロジェクトの設定において、
ODP.NET、Connector/Netのドライバに対する参照設定を
ローカルコピーをしない設定にし、DLLファイルを作成します。

ASP.NETアプリを作成し、作成したクラスライブラリに対する参照を設定。
ビルドを実行すると、web.configに下記の設定が自動的に追加されてしまいます。

コード:

<assemblies>
<add assembly="Oracle.DataAccess, Version=...(省略)"/>
<add assembly="MySql.Data, Version=...(省略)"/>
</assemblies>



ODP.NETをインストールし、作成したASP.NETを実行すると、
MySql.Dataアセンブリのロードに失敗した旨のエラーが表示されてしましました。

クラスライブラリは、複数のASP.NETアプリからの参照を想定しています。
また、それぞれのASP.NETアプリは、Oracle、MySQLどちらかのDBのみを使用します。


[質問1]
使用するデータプロバイダのみをインストールして動作させられるよう、
クラスライブラリの参照を設定することはできるのでしょうか。

[質問2]
データプロバイダは、.NET Framework 2.0対応のものであれば、
バージョンに依存せずローディングしたいと考えています。
クラスライブラリのコード中で、
System.Reflection.Assembly.LoadWithPartialNameメソッド
を使用し、動的にアセンブリをローディングさせるコードを
書いてみましたが、LoadWithPartialNameメソッドは、
.NET Framework 2.0での使用は推奨されていない様子。
どのような代替案があるのでしょうか。


だらだらと纏まりのない質問申し訳ございません。
ご教授のほどよろしくお願い申し上げます。


[ メッセージ編集済み 編集者: EIS 編集日時 2007-08-23 01:44 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2007-08-23 09:47
引用:

System.Reflection.Assembly.LoadWithPartialNameメソッド
を使用し、動的にアセンブリをローディングさせるコードを
書いてみましたが、LoadWithPartialNameメソッドは、
.NET Framework 2.0での使用は推奨されていない様子。
どのような代替案があるのでしょうか。


System.Reflection.Assembly.Load(string)
引数には、アセンブリの完全名を指定すればできそうな気がする。
EIS
会議室デビュー日: 2003/11/23
投稿数: 6
投稿日時: 2007-08-25 18:56
お礼が遅くなり申し訳ございません。

コード:
Assembly asm = Assembly.Load("厳密名");
Type type = asm.GetType("Oracle.DataAccess.Client.OracleConnection");
return (DbConnection)Activator.CreateInstance(type);


とすることで動的読み込みができました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)