问题
i have 2 assemblies. i added classlib1 into classLib2 references. like that:
 
and i used it like that:
namespace ClassLibrary2
{
    public class Class1
    {
        public Class1()
        {
        }
        public int GetSum(int a , int b)
        {
            try
            {
                ClassLibrary1.Class1 ctx = new ClassLibrary1.Class1();
                return ctx.Sum(a, b);
            }
            catch
            {
                return -1;
            }
        }
    }
}
Also i want to load (class1lib and Class2Lib) another C# project dynamically by using AppDomain.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Reflection;
using System.Collections;
using System.Reflection.Emit;
namespace WcfService3
{
    public partial class Default : System.Web.UI.Page
    {
        public static ArrayList arryFiles { get; set; }
        protected void Page_Load(object sender, EventArgs e)
        {
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        arryFiles = new ArrayList();
        List<byte[]> binaryList = new List<byte[]>();
        // string fileName = @"S:\Source\Yusuf.Karatoprak\plugin\ClassLibrary1.dll";
        DirSearch(@"S:\Source\Yusuf.Karatoprak\plugin");
        foreach (var filePath in arryFiles)
        {
            FileStream fileStream = File.OpenRead(filePath.ToString());
            byte[] buffer = new byte[fileStream.Length];
            fileStream.Read(buffer, 0, Convert.ToInt32(fileStream.Length));
            fileStream.Dispose();
            binaryList.Add(buffer);
            //Assembly[] assBefore = AppDomain.CurrentDomain.GetAssemblies();
            //AppDomain.CurrentDomain.Load(buffer);
            //Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
            //Type t = Type.GetType("ClassLibrary1.Class1,ClassLibrary1");
        }
        new AssemblyLoader().LoadAndCall(binaryList);
    }
    static void DirSearch(string sDir)
    {
        try
        {
            foreach (string f in Directory.GetFiles(sDir, "*.dll"))
            {
                if (!arryFiles.Contains(f))
                    arryFiles.Add(f);
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                if (d != null)
                {
                    foreach (string f in Directory.GetFiles(d, "*.dll"))
                    {
                        if (!arryFiles.Contains(f))
                            arryFiles.Add(f);
                    }
                    DirSearch(d);
                }
                else
                    break;
            }
        }
        catch (System.Exception excpt)
        {
            throw new Exception(excpt.Message);
        }
    }
}
public class AssemblyLoader : MarshalByRefObject
{
    public void LoadAndCall(List<byte[]> binaryList)
    {
        Assembly loadedAssembly=null;
        Assembly[] assBefore = AppDomain.CurrentDomain.GetAssemblies();
        foreach (byte[] binary in binaryList)
        {
            loadedAssembly = AppDomain.CurrentDomain.Load(binary);
        }
        Assembly[] assAfter = AppDomain.CurrentDomain.GetAssemblies();
        object[] tt = { 3, 6 };
        Type type = loadedAssembly.GetType("ClassLibrary2.Class1");
        object loaded = loadedAssembly.CreateInstance("ClassLibrary2.Class1", true, BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance, null, new object[] { }, null, null);
       // object obj = Activator.CreateInstance(type);
        ObjectCreateMethod inv = new ObjectCreateMethod(type); //Specify Type
        Object obj = inv.CreateInstance();
        MethodInfo minfo = type.GetMethod("GetSum", BindingFlags.Instance | BindingFlags.Public | BindingFlags.CreateInstance);
        int x = (int)minfo.Invoke(obj, new Object[] { 3, 6 });
        Console.WriteLine(x);
    }
}
public class ObjectCreateMethod
{
    delegate object MethodInvoker();
    MethodInvoker methodHandler = null;
    public ObjectCreateMethod(Type type)
    {
        CreateMethod(type.GetConstructor(Type.EmptyTypes));
    }
    public ObjectCreateMethod(ConstructorInfo target)
    {
        CreateMethod(target);
    }
    void CreateMethod(ConstructorInfo target)
    {
        DynamicMethod dynamic = new DynamicMethod(string.Empty,
                    typeof(object),
                    new Type[0],
                    target.DeclaringType);
        ILGenerator il = dynamic.GetILGenerator();
        il.DeclareLocal(target.DeclaringType);
        il.Emit(OpCodes.Newobj, target);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Ret);
        methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
    }
    public object CreateInstance()
    {
        return methodHandler();
    }
}
}
Why can not load and Exception error return to me:
 
 
Look inner exception: Could not load file or assembly 'ClassLibrary1 But i loaded Classlib2 abd Classlib1 . class2 depends on classlib1 how to use classlib1 method i want to use GetSum(int a , int b) method after load assemblies:
回答1:
Found this somewhat similar question. Handling the resolve event seems to be a last ditch effort. Just try it if you run out of options. Replace with your S:\Source\Yusuf.Karatoprak\plugin. You can also try handling the AppDomain.AssemblyLoad event, to see what was loaded from your binaries.
@programmerist, cheers!
回答2:
Not very sure if it's possible to link a reference to another DLL to the assembly duriong dynamic load. Not at least that I'm aware of. But generaly,
- if you're talking about plugins, do not link them together. If not, there is no any reason to have plugin based system. 
- I would try to check the - .NET Frameworkversion of your host app, in regard of the plugins it loads. Could be some versioning conflict.
Hope this helps.
来源:https://stackoverflow.com/questions/9663920/how-to-use-loaded-dlls-assembly-methods-which-is-referenced-to-another-assembly