c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转

c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转,第1张

利用反射调用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的使用方法小白求问等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10209089.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-06
下一篇2023-05-06

发表评论

登录后才能评论

评论列表(0条)

    保存