程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#完成靜態加載dll的辦法

C#完成靜態加載dll的辦法

編輯:C#入門知識

C#完成靜態加載dll的辦法。本站提示廣大學習愛好者:(C#完成靜態加載dll的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是C#完成靜態加載dll的辦法正文


本文實例講述了C#完成靜態加載dll的辦法。分享給年夜家供年夜家參考。詳細完成辦法以下:


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.IO;

namespace Alif.CommonAPI.DynamicLoadAssembly
{
    public class AssemblyDynamicLoader<T>
    {
        private AppDomain appDomain;

        private DynamicRemoteLoadAssembly<T> remoteLoader;

        public T InvokeMethod(string assemblyName, string assemblyPath, string assemblyConfigFilePath, string fullClassName, string methodName, params object[] args)
        {
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationName = "ApplicationLoader";
            setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory + @"bin\";
            //setup.PrivateBinPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "private");
            setup.CachePath = setup.ApplicationBase;
            setup.ShadowCopyFiles = "true";
            if (assemblyConfigFilePath != string.Empty)
            {
                setup.ConfigurationFile = AppDomain.CurrentDomain.BaseDirectory + assemblyConfigFilePath;
            }
            setup.ShadowCopyDirectories = setup.ApplicationBase;
            setup.LoaderOptimization = LoaderOptimization.SingleDomain;

            this.appDomain = AppDomain.CreateDomain("ApplicationLoaderDomain", null, setup);
            String name = Assembly.GetExecutingAssembly().GetName().FullName;

            this.remoteLoader = (DynamicRemoteLoadAssembly<T>)this.appDomain.CreateInstanceAndUnwrap(name, typeof(DynamicRemoteLoadAssembly<T>).FullName);

            assemblyName = AppDomain.CurrentDomain.BaseDirectory + assemblyPath + assemblyName;

            return this.remoteLoader.InvokeMethod(assemblyName, fullClassName, methodName, args);
        }

        /// <summary>
        ///
        /// </summary>
        public void Unload()
        {
            try
            {
                AppDomain.Unload(this.appDomain);
                this.appDomain = null;
            }
            catch (CannotUnloadAppDomainException ex)
            {

            }
        }
    }
}


using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
using System.Globalization;

namespace Alif.CommonAPI.DynamicLoadAssembly
{
    public class DynamicRemoteLoadAssembly<T> : MarshalByRefObject
    {
        private Assembly assembly = null;

        public T InvokeMethod(string assemblyPath, string fullClassName, string methodName, params object[] args)
        {
            this.assembly = null;
            T result = default(T);
            try
            {
                this.assembly = Assembly.LoadFile(assemblyPath);
                Type pgmType = null;
                if (this.assembly != null)
                {
                    pgmType = this.assembly.GetType(fullClassName, true, true);
                }
                else
                {
                    pgmType = Type.GetType(fullClassName, true, true);
                }
                BindingFlags defaultBinding = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.InvokeMethod | BindingFlags.Static;
                CultureInfo cultureInfo = new CultureInfo("es-ES", false);
                try
                {
                    MethodInfo methisInfo = assembly.GetType(fullClassName, true, true).GetMethod(methodName);

                    if (methisInfo == null)
                    {
                        new Exception("EMethod does not exist!");
                    }

                    if (methisInfo.IsStatic)
                    {
                        if (methisInfo.GetParameters().Length == 0)
                        {
                            if (methisInfo.ReturnType == typeof(void))
                            {
                                pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo);
                            }
                            else
                            {
                                result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo);
                            }
                        }
                        else
                        {
                            if (methisInfo.ReturnType == typeof(void))
                            {
                                pgmType.InvokeMember(methodName, defaultBinding, null, null, args, cultureInfo);
                            }

                            else
                            {
                                result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, args, cultureInfo);
                            }
                        }
                    }
                    else
                    {

                        if (methisInfo.GetParameters().Length == 0)
                        {
                            object pgmClass = Activator.CreateInstance(pgmType);
                            if (methisInfo.ReturnType == typeof(void))
                            {
                                pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, null, cultureInfo);
                            }
                            else
                            {
                                result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, null, cultureInfo);
                            }
                        }
                        else
                        {
                            object pgmClass = Activator.CreateInstance(pgmType);
                            if (methisInfo.ReturnType == typeof(void))
                            {
                                pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, args, cultureInfo);
                            }
                            else
                            {
                                result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, pgmClass, args, cultureInfo);
                            }
                        }
                    }
                }
                catch (Exception e)
                {
                    result = (T)pgmType.InvokeMember(methodName, defaultBinding, null, null, null, cultureInfo);
                }
                return result;
            }
            catch (Exception ee)
            {
                return result;
            }
        }
    }
}

願望本文所述對年夜家的C#法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved