利用反射調用DLL,並使用DLL中的類創建對象,類型必須加全域名。
不過妳的問題是不是這個原因需要排查,另外,妳可以為妳的類定義壹個接口,返回後強制轉換為接口試試。
我給妳個,給定域名空間和DLL文件路徑及文件名、類名,動態創建對象的構造類。看看有沒有幫助。
using?System;using?System.Collections.Generic;
using?System.Linq;
using?System.Text;
using?System.Reflection;
using?System.Collections;
namespace?ICom.CommonLib
{
///?<summary>
///?使用應用程序域動態方式創建對象。
///?</summary>
public?class?ObjectConstructor?:?IDisposable,IObjectConstructor
{
#region?內部對象
AppDomain?_Domain?=?null;
Hashtable?_DomainHash?=?new?Hashtable();
RemoteAssemblyFactory?_RAF?=?null;
string?_DomainName;
bool?_Disposed;
#endregion
#region?構造函數
///?<summary>
///?析構函數,釋放內部對象。
///?</summary>
~ObjectConstructor()
{
Dispose(false);
}
#endregion
#region?+屬性
#region?狀態消息
string?_Message?=?"";
///?<summary>
///?讀取狀態消息。
///?</summary>
public?string?Message
{
get?{?return?_Message;?}
}
#endregion
#endregion
#region?方法
///?<summary>
///?創建應用程序域。
///?<param?name="DomainName">應用域名。</param>
///?</summary>
///?<returns>成功標誌。</returns>
public?bool?CreateDomain(string?DomainName)
{
if?(!CreateRemoteAssemblyFactory(DomainName))?return?false;
_DomainName?=?DomainName;
return?true;
}
///?<summary>
///?動態創建對象。
///?<param?name="DllFile">庫文件路徑和文件名。</param>
///?<param?name="ObjectFullName">對象命名空間名及對象名稱。</param>
///?</summary>
///?<returns>動態創建的對象或者空值(NULL)。</returns>
public?object?CreateObject(string?DllFile,string?ObjectFullName)
{
Assembly?asm;
Type?type;
object?obj?=?null;?;
if?(_RAF?!=?null)
{
try
{
asm?=?_RAF.Create(DllFile);
type?=?asm.GetType(ObjectFullName);
obj?=?Activator.CreateInstance(type);
}
catch?(Exception?e)
{
_Message?=?e.Message;
}
}
return?obj;
}
#region?釋放對象
///?<summary>
///?釋放托管資源。
///?</summary>
public?void?Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
///?<summary>
///?釋放所有資源。
///?</summary>
///?<param?name="disposing">Dispose調用標誌。</param>
protected?virtual?void?Dispose(bool?disposing)
{
if?(!_Disposed)
{
if?(disposing)
{
if?(_RAF?!=?null)?_RAF.Dispose();
if?(_DomainHash.ContainsKey(_DomainName))
{
_Domain?=?(AppDomain)_DomainHash[_DomainName];
AppDomain.Unload(_Domain);
_DomainHash.Remove(_DomainName);
}
}
//非托管
_Disposed?=?true;
}
}
#endregion
#endregion
#region?局部函數
private?bool?CreateRemoteAssemblyFactory(string?dmn)
{
AppDomainSetup?setup?=?new?AppDomainSetup();
string?thisdll,?nspc?=?this.GetType().Namespace;
setup.ShadowCopyFiles?=?"true";
_Domain?=?AppDomain.CreateDomain(dmn,?null,?setup);
_DomainHash.Add(dmn,?_Domain);
thisdll?=?Assembly.GetExecutingAssembly().Location;
try
{
_RAF?=?(RemoteAssemblyFactory)_Domain.CreateInstanceFromAndUnwrap(thisdll,?"ICom.CommonLib.RemoteAssemblyFactory");
return?true;
}
catch?(Exception?e)
{
_Message?=?e.Message;
}
return?false;
}
#endregion
}
///?<summary>
///?遠程程序集工廠。
///?</summary>
public?class?RemoteAssemblyFactory?:?MarshalByRefObject,?IDisposable
{
Assembly?_ASM?=?null;
bool?_Disposed;
///?<summary>
///?析構函數,釋放內部對象。
///?</summary>
~RemoteAssemblyFactory()
{
Dispose(false);
}
///?<summary>
///?創建遠程程序集。
///?</summary>
///?<param?name="dllFile">程序集所在DLL文件的路徑和文件名。</param>
///?<returns>程序集對象或空值(NULL)。</returns>
public?Assembly?Create(string?dllFile)
{
try
{
_ASM?=?Assembly.LoadFrom(dllFile);
return?_ASM;
}
catch?(Exception?e)
{
throw?e;
}
}
///?<summary>
///?釋放托管資源。
///?</summary>
public?void?Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
///?<summary>
///?釋放資源。
///?</summary>
///?<param?name="disposing">Dispose調用標誌。</param>
protected?virtual?void?Dispose(bool?disposing)
{
if?(!_Disposed)
{
if?(disposing)
{
_ASM?=?null;
}
//非托管
_Disposed?=?true;
}
}
}
}