
利用反射调用DLL,并使用DLL中的类创建对象,类型必须加全域名。
不过你的问题是不是这个原因需要排查,另外,你可以为你的类定义一个接口,返回后强制转换为接口试试。
我给你个,给定域名空间和DLL文件路径及文件名、类名,动态创建对象的构造类。看看有没有帮助。
using System;using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
using SystemReflection;
using SystemCollections;
namespace IComCommonLib
{
/// <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 = _RAFCreate(DllFile);
type = asmGetType(ObjectFullName);
obj = ActivatorCreateInstance(type);
}
catch (Exception e)
{
_Message = eMessage;
}
}
return obj;
}
#region 释放对象
/// <summary>
/// 释放托管资源。
/// </summary>
public void Dispose()
{
Dispose(true);
GCSuppressFinalize(this);
}
/// <summary>
/// 释放所有资源。
/// </summary>
/// <param name="disposing">Dispose调用标志。</param>
protected virtual void Dispose(bool disposing)
{
if (!_Disposed)
{
if (disposing)
{
if (_RAF != null) _RAFDispose();
if (_DomainHashContainsKey(_DomainName))
{
_Domain = (AppDomain)_DomainHash[_DomainName];
AppDomainUnload(_Domain);
_DomainHashRemove(_DomainName);
}
}
//非托管
_Disposed = true;
}
}
#endregion
#endregion
#region 局部函数
private bool CreateRemoteAssemblyFactory(string dmn)
{
AppDomainSetup setup = new AppDomainSetup();
string thisdll, nspc = thisGetType()Namespace;
setupShadowCopyFiles = "true";
_Domain = AppDomainCreateDomain(dmn, null, setup);
_DomainHashAdd(dmn, _Domain);
thisdll = AssemblyGetExecutingAssembly()Location;
try
{
_RAF = (RemoteAssemblyFactory)_DomainCreateInstanceFromAndUnwrap(thisdll, "IComCommonLibRemoteAssemblyFactory");
return true;
}
catch (Exception e)
{
_Message = eMessage;
}
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 = AssemblyLoadFrom(dllFile);
return _ASM;
}
catch (Exception e)
{
throw e;
}
}
/// <summary>
/// 释放托管资源。
/// </summary>
public void Dispose()
{
Dispose(true);
GCSuppressFinalize(this);
}
/// <summary>
/// 释放资源。
/// </summary>
/// <param name="disposing">Dispose调用标志。</param>
protected virtual void Dispose(bool disposing)
{
if (!_Disposed)
{
if (disposing)
{
_ASM = null;
}
//非托管
_Disposed = true;
}
}
}
}
电脑文件会显示appPluginBasedll因为计算机中丢失apppluginBasedll。
dll文件一般被存放在C:\Windows\System目录下。电脑系统文件因经常会受到病毒的侵扰,导致系统文件、dll文件等丢失、损坏,一些包括游戏在内的应用程序无法启动。
以上就是关于c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转全部的内容,包括:c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转、为什么电脑文件会显示appPluginBase.dll、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)