如何动态加载引用了其他程序集的程序集,如程序集A引用了程序集B,如何动态加载程序集A
如题,我知道通过反射可以动态加载一个程序集,但是如果这个程序集引用了另一个程序集,就不行了,还请大牛指点迷津 反射 --------------------编程问答-------------------- 把引用的那个程序集放到当前项目和exe相同的目录下就OK! --------------------编程问答--------------------程序集B有没有办法也动态加载进来? --------------------编程问答-------------------- 其实我要的就是,把多个程序集放在一个文件里面,然后通过程序读取并调用 --------------------编程问答-------------------- Assembly assm=Assembly.LoadFrom(Path);
Object obj = assm.CreateInstance(TypeName) --------------------编程问答--------------------
我知道怎么加载,主要的问题是因为两个都是动态加载,而程序集A引用了程序集B --------------------编程问答-------------------- 是不是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! --------------------编程问答--------------------
我想做的就是你说的后面的那种,“如果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#