using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var internalType = Assembly.Load("ClassLibrary1").GetType("ClassLibrary1.Greeter"); // 加載目標程序集
var internalMethod = internalType.GetMethod("Greet", BindingFlags.Public|BindingFlags.Static); //加載程序集中的方法
var proxy = GreetingFactory.Create(); //創建代理
var result = internalMethod.Invoke(null, new[] { proxy });
Console.WriteLine(result);
Console.Read();
}
}
public class GreetingProxy : DispatchProxy
{
private GreetingImp _greetingImp;
public GreetingProxy()
{
_greetingImp = new GreetingImp();
}
protected override object Invoke(MethodInfo targetMethod, object[] args)
{
var v = _greetingImp.GetType().GetMethod(targetMethod.Name);
return v.Invoke(_greetingImp, args);
}
public class GreetingImp
{
public string Message => "Hello World";
}
}
public class GreetingFactory
{
public static object Create()
{
var internalType = Assembly.Load("ClassLibrary1").GetType("ClassLibrary1.IGreeting");
return typeof(DispatchProxy)
.GetMethod(nameof(DispatchProxy.Create))
.MakeGenericMethod(internalType, typeof(GreetingProxy))
.Invoke(null, null);
}
}
}
using System;
namespace ClassLibrary1
{
internal class Greeter
{
public static void Greet(IGreeting greeting)
{
Console.WriteLine(greeting.Message);
Console.WriteLine(greeting.Test());
}
}
internal interface IGreeting
{
string Message { get; set; }
string Test();
}
}