我有一程序集,用
Assmebly asm = Assembly.LoadFrom(..),
IProvider provider = (IProvider)asm.CreateInstance(..);这样转换,转换不了,
但是如果将代码移值到欲转换对象所在程序集的内部,然后用(IProvider)Assembly.GetExecutingAssembly().CreateInstance(..)这样就可以转换成功.
想了一天了,也没想出原因,大家帮帮忙吧..
Assmebly asm = Assembly.LoadFrom(..),
IProvider provider = (IProvider)asm.CreateInstance(..);这样转换,转换不了,
但是如果将代码移值到欲转换对象所在程序集的内部,然后用(IProvider)Assembly.GetExecutingAssembly().CreateInstance(..)这样就可以转换成功.
想了一天了,也没想出原因,大家帮帮忙吧..
解决方案 »
- winform 用户控件禁用和启用主界面的控件
- 大家来帮我看看这个简单的程序哪错了?
- 在数据集中用调用存储过程,更新不了数据!
- WCF(Windows Communication Foundation)
- 为什么我在WONFORM程序中,新打开的窗口老是在主界面的后面?怎样提到前面来?
- 【有难度,期待高手解答】如何用C#实现将字符串"(3 > 2) && (1 < 2 || 1 > 3)"的逻辑判断结果为true or false。
- 用C#编写的Winform程序不安装Microsoft .NET Framework能运行吗?
- CSDN上的朋友给女朋友送花的我打五折...........
- PL/SQL查询表和鼠标不停闪
- 怎么在WIN FORM中拖曳一个按钮使其实现移动?
- 视频监控显示图片和播放视频,急求助,谢谢.
- 关于用Installshiled打包时,加载合并模块的问题,谢谢!
被LoadFrom的程序集为Project。那么,Main中的IProvider和Project中的IProvider只能有一个声明,这才能保证这两个IProvider是一样的。
最好的解决方法是第三个程序集如Interface中定义IProvider接口,然后Main和Project均引用它,这个时候,两个程序集中的IProvider才是一样的。不然,就必须用反射来使用IProvider,这样编码太麻烦。
IProvider在Project中声明,而只是在Main中调用.
如
namespace Project
{
public interface IProvider
{
}
public class IOleProvider : IProvider
{
}
}
以上编译为Project.dll
Main.cs
{
Assembly asm = Assembly.CreateInstance("Project.dll");
IProvider provider = (Project.IProvider)asm.CreateInstance("Project.IOleProvider");
//就是这样的,但就是不能转换.
}
另外就是,你的写法接口也能创建实例?
Main.dll只是引用Project.dll中的IProvider接口
Main.dll只是引用Project.dll中的IProvider接口
那就奇怪了,既然是引用了,你还要动态加载干吗?
类名不要以I开头,很容易被误会
当在Project.dll中用Assembly.GetExecuteAssembly().CreateInstance(..)可以创建实例并可以转换为IProvider,但是在外部或在Project.dll中用Assembly.LoadFrom(..).CreateInstance(..)时,却不能转换为IProvider.
public interface IDataProvider
{
System.Data.IDbConnection GetConnection( string connString ); System.Data.IDbDataParameter IParameter( string name, BD_DbType dbType ); System.Data.IDbDataParameter IParameter( string name,BD_DbType dbType,int size, string srcColumn ); int ConverterBD_DbType( BD_DbType dbType );
System.Data.IDbDataAdapter IDataAdapter
{
get;
}
}
--------------------
public class OleAccessProvider : BD.Data.IDataProvider
{
public OleAccessProvider(){}
#region IDataProvider 成员 public IDbConnection GetConnection(string connString)
{
return new OleDbConnection( connString );
} public IDbDataParameter IParameter(string name, BD_DbType dbType)
{
return new OleDbParameter( name,(OleDbType)this.ConverterBD_DbType( dbType ) );
} IDbDataParameter IDataProvider.IParameter(string name, BD_DbType dbType, int size, string srcColumn)
{
return new OleDbParameter( name,(OleDbType)this.ConverterBD_DbType( dbType ),size,srcColumn );
} public int ConverterBD_DbType(BD_DbType dbType)
{...} public IDbDataAdapter IDataAdapter
{
get
{
return new OleDbDataAdapter();
}
} #endregion
}
------------------
Main.dll
public class Test
{
private IDbConnection conn;
private IDbCommand comm;
private IDataProvider provider;
private IDbDataAdapter adapter;
public void T( string str )
{
Assembly asm = Assembly.LoadFrom( @"Project.dll" );
// Type type = asm.GetType( "BD.Data.OleAccessProvider" );
provider = (BD.Data.OleAccessProvider)asm.CreateInstance("BD.Data.OleAccessProvider");这句就出错.
// provider = (IDataProvider)Assembly.GetExecutingAssembly().CreateInstance("BDQQ.Data.SqlProvider");这样就可以创建实例
this.conn = provider.GetConnection( str );
this.comm = conn.CreateCommand();
this.adapter = provider.IDataAdapter;
}
这种情况下是将此部分放在Project.dll中,
在Main.cs中根本就不能创建,难道要在Main.cs中也应该有IDataProvider接口的定义?
两种方案。总而言之,如果要利用IDataProvidor来进行两个程序集之间的调用,就必须让两个程序集都包含同一个IDataProvider的定义。
可以在Main中定义,而Project引用Main,然后再利用在Main中定义的IDataProvider来实现n个类,这样,Main就可以动态加载Project,并利用自己的IDataProvider来执行操作。也可以在一个接口程序集中定义IDataProvider接口,而Main和Project都引用这个接口程序集。
谢谢Ivony()