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;

            }

        }

    }

}

电脑文件会显示appPluginBasedll因为计算机中丢失apppluginBasedll。

dll文件一般被存放在C:\Windows\System目录下。电脑系统文件因经常会受到病毒的侵扰,导致系统文件、dll文件等丢失、损坏,一些包括游戏在内的应用程序无法启动。

以上就是关于c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转全部的内容,包括:c#调用dll里的某个方法,该方法返回值类型是dll里定义的一个类,该如何强转、为什么电脑文件会显示appPluginBase.dll、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/web/9308104.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存