當前位置:編程學習大全網 - 網絡軟體 - c#調用dll裏的某個方法,該方法返回值類型是dll裏定義的壹個類,該如何強轉

c#調用dll裏的某個方法,該方法返回值類型是dll裏定義的壹個類,該如何強轉

利用反射調用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;

}

}

}

}

  • 上一篇:劉備手下有五虎上將.請問是哪五位?
  • 下一篇:jdk和jre區別是什麽?
  • copyright 2024編程學習大全網