当前位置:编程学习 > C#/ASP.NET >>

如何动态加载引用了其他程序集的程序集,如程序集A引用了程序集B,如何动态加载程序集A

如题,我知道通过反射可以动态加载一个程序集,但是如果这个程序集引用了另一个程序集,就不行了,还请大牛指点迷津 反射 --------------------编程问答-------------------- 把引用的那个程序集放到当前项目和exe相同的目录下就OK! --------------------编程问答--------------------
引用 1 楼 porenasckx 的回复:
把引用的那个程序集放到当前项目和exe相同的目录下就OK!

程序集B有没有办法也动态加载进来? --------------------编程问答-------------------- 其实我要的就是,把多个程序集放在一个文件里面,然后通过程序读取并调用 --------------------编程问答-------------------- Assembly assm=Assembly.LoadFrom(Path);
Object obj = assm.CreateInstance(TypeName) --------------------编程问答--------------------
引用 4 楼 porenasckx 的回复:
Assembly assm=Assembly.LoadFrom(Path);
Object obj = assm.CreateInstance(TypeName)

我知道怎么加载,主要的问题是因为两个都是动态加载,而程序集A引用了程序集B --------------------编程问答-------------------- 是不是C要引用A,但是A引用了B。

如果是的话,就把B放到C的debug目录下。然后在C中引用A。

如果不是请LZ把要求说明白。


--------------------编程问答--------------------
引用 6 楼 porenasckx 的回复:
是不是C要引用A,但是A引用了B。

如果是的话,就把B放到C的debug目录下。然后在C中引用A。

如果不是请LZ把要求说明白。

我的问题就是程序C引用了程序集A,程序集A又引用了程序集B,然后我需要程序集A和程序集B都是动态加载,我试过在程序集A中动态加载程序集B,也不行,我不想把这些程序集拷到C的目录下面,求大牛解答 --------------------编程问答-------------------- 你必须要有入口啊!

首先C能引用A,然后A程序里边引用B。

引用分直接在写代码的时候在资源管理器添加引用和用Assmbly引用加载

如果B是A的子程序,是直接在A程序的资源管理器里引用的。那么你在C里边就要把B放进debug里去。

如果B是A用Assmbly引用的,那就直接用C引用A! --------------------编程问答--------------------
引用 8 楼 porenasckx 的回复:
你必须要有入口啊!

首先C能引用A,然后A程序里边引用B。

引用分直接在写代码的时候在资源管理器添加引用和用Assmbly引用加载

如果B是A的子程序,是直接在A程序的资源管理器里引用的。那么你在C里边就要把B放进debug里去。

如果B是A用Assmbly引用的,那就直接用C引用A!

我想做的就是你说的后面的那种,“如果B是A用Assmbly引用的,那就直接用C引用A”,但是我试了,C在调用A中的函数的时候,报  “未能加载文件或程序集“Lib2, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”或它的某一个依赖项。系统找不到指定的文件。”

    
public class Test1
    {
        private readonly LoadDll _loader = new LoadDll();

        public Test1()
        {
            _loader.Load(new[] { @"G:\ProjectVS2010\DynamicLoadDll\Lib1\bin\Debug\Lib2.dll" });
        }

        public string Execute(string s)
        {
            return _loader.Invoke("Lib2", "Test2", "Execute", new object[] {s}).ToString();
        }
    }


LoadDll对象是用来动态加载程序集的

public class LoadDll
    {
        private byte[] LoadDllFromResource(string lpFileName)
        {
            var nowAssembly = Assembly.GetEntryAssembly();
            Stream fs = null;
            try
            {
                // 尝试读取资源中的 DLL
                fs = nowAssembly.GetManifestResourceStream(nowAssembly.GetName().Name + "." + lpFileName);
            }
            finally
            {
                // 如果资源没有所需的 DLL ,就查看硬盘上有没有,有的话就读取
                if (fs == null && !File.Exists(lpFileName))
                {
                    throw (new Exception(" 找不到文件 :" + lpFileName));
                }
                
                if (fs == null && File.Exists(lpFileName))
                {
                    fs = new FileStream(lpFileName, FileMode.Open);
                }
                if (fs == null)
                {
                    throw new Exception("加载DLL失败");
                }
            }
         
            var buffer = new byte[(int) fs.Length];
            fs.Read(buffer, 0, (int)fs.Length);
            fs.Close();
            return buffer; // 以 byte[] 返回读到的 DLL
        }

        public void Load(string[] assemblyFileNames)
        {
            if (null != assemblyFileNames && assemblyFileNames.Any())
            {
                assemblyFileNames
                    .ToList()
                    .ForEach(module => Assembly.Load(LoadDllFromResource(module)));
            }
        }

        public object Invoke(string nameSpace, string className, string lpProcName, object[] objArrayParameter)
        {
            try
            {
                foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    foreach (var t in assembly.GetTypes())
                    {
                        if (t.Namespace != nameSpace || t.Name != className)
                        {
                            continue;
                        }

                        var m = t.GetMethod(lpProcName);
                        if (m != null)
                        {
                            // 调用并返回
                            var obj = Activator.CreateInstance(t);
                            return m.Invoke(obj, objArrayParameter);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                System.Windows.Forms.MessageBox.Show(e.ToString());
            }

            throw new Exception("程序集未加载或调用方法失败");
        }
    }
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,