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;

}

}

}

}