
利用反射调用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;
}
}
}
}
文件名:测试DLL 版本 2 程序集 程序集1 子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码 _临时子程序 () ' 在初始化代码执行完毕后调用测试代码 返回(0) ' 返回值被忽略。 子程序 _临时子程序 ' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 注意不要修改本子程序的名称、参数及返回值类型。 子程序 外部接口_测试, 文本型, 公开 参数 参_text, 文本型 参_text =参_text +“” 返回(参_text) 代码没有太多 *** 作,只是简单的将原始文本附加一个空格。 简单的写一个调用程序。 测试调用e 代码如下: DLL申明: 版本 2 DLL命令 外部接口_测试, 文本型, "测试dll", "外部接口_测试" 参数 参_text, 文本型 调用代码: 版本 2 程序集 窗口程序集1 子程序 __启动窗口_创建完毕 局部变量 局部_text, 文本型 局部_text = 外部接口_测试 (“易语言DLL调用测试”) +“”+ 外部接口_测试 (“易语言DLL调用测试”) +“”+ 外部接口_测试 (“易语言DLL调用测试”) +“”+ 外部接口_测试 (“易语言DLL调用测试”) 输出调试文本 (局部_text) 输出的结果却为: 瓠 易语言DLL调用测试 瓠 易语言DLL调用测试 从结果可以看出,部分应该输出为“易语言DLL调用测试”,却出现了“瓠”,就是这样的问题。
麻烦采纳,谢谢!
在VS的对象浏览器中可以查看所有的对象,先选择浏览范围为我的解决方案,下方可以看到所有引用的程序集,展开你调用的程序集就可以看到所有的成员。如果没有注释你只能去找开发文档了,封装的dll是看不到具体实现的。
你的 DLL 有用到 这个 窗口 肯定 调用的时候 也就有了我写了 一个试了试 是可以的
下面这个是 DLL
版本 2
程序集 程序集1
子程序 _启动子程序, 整数型, , 请在本子程序中放置动态链接库初始化代码
_临时子程序 () ' 在初始化代码执行完毕后调用测试代码
返回 (0) ' 返回值被忽略。
子程序 _临时子程序
' 本名称子程序用作测试程序用,仅在开发及调试环境中有效,编译发布程序前将被系统自动清空,请将所有用作测试的临时代码放在本子程序中。 注意不要修改本子程序的名称、参数及返回值类型。
子程序 子程序1, , 公开
载入 (窗口1, , 真)
下面这个是声明 DLL
版本 2
DLL命令 DLL命令1, , "1", "子程序1"
下面这个是调用 DLL
版本 2
程序集 窗口程序集1
子程序 _按钮1_被单击
DLL命令1 ()
用web站点调用dll,然后在dll里封装实现数据,或者资源文件或者执行其他程序,比如网页等, dll注册到客户端,然后每次访问该网站都先检测是否有该dll已经注册,没有就再注册,有些asp网站木马就是这样实现的,首先获得服务器的WScriptShell的权限,然后利用FSO判断DLL是否存在,shell调用regsvr32注册dll 。可以用vc编写ISAPI DLL,也可以在IIS里增加ISAPI映射调用。ActiveX DLL需要注册,不像C#有程序集,好象ASP只能调用ActiveX DLL,是不是它比较老的缘故。使用>
以上就是关于c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转全部的内容,包括:c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转、E语言调用DLL导致返回值出错问题举例和解决办法、C#调用了一个DLL文件,如何查看DLL的使用方法小白求问等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)