using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Reflection;
using ClassLibrary3;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
String AddinDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
var AddInAssembilies = Directory.EnumerateFiles(AddinDir, "*.dll");
FileStream fs = new FileStream(AddInAssembilies.Last(), FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
byte[] bFile = br.ReadBytes((int)fs.Length);
br.Close();
fs.Close();
var dll = Assembly.Load(bFile).ExportedTypes;
foreach (Type t in dll)
{
IAddIN ai = (IAddIN)Activator.CreateInstance(t);
Console.WriteLine(ai.DoSomething(3));
}
//下面的load会报错,替换成 LoadFile(string path) 或者LoadFrom(string path)都不会有问题
//var AddInTypes = from file in AddInAssembilies
// let assembly = Assembly.Load(file)
// from t in assembly.ExportedTypes
// where t.IsClass && typeof(IAddIN).GetTypeInfo().IsAssignableFrom(t.GetTypeInfo())
// select t;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary3
{
public interface IAddIN { String DoSomething(Int32 x); }
}
using ClassLibrary3;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary4
{
public sealed class AddIn_A : IAddIN
{
public AddIn_A() { }
public string DoSomething(int x)
{
return $"AddIN_A: {x}";
}
}
public sealed class AddIn_B : IAddIN
{
public AddIn_B() { }
public string DoSomething(int x)
{
return $"AddIN_B: {x}";
}
}
}
C# 反射
最新推荐文章于 2025-01-31 00:00:00 发布
本文详细探讨了C#中的反射机制,包括如何使用反射动态创建对象、获取类型信息、调用成员方法以及其在实际开发中的应用和注意事项。通过实例解析,帮助读者掌握这一强大的编程工具。
2178

被折叠的 条评论
为什么被折叠?



