C# 用C语言获取整个程序集#

C# 用C语言获取整个程序集#,c#,.net,dll,reflection,.net-assembly,C#,.net,Dll,Reflection,.net Assembly,我试图消除API中的一个调用,在该调用中最终用户必须在其代码中传递Assembly.getExecutionGassembly(),当前我的代码如下所示 public static Dictionary<int, Packet> Packets { get; private set; } public static void Init() { Assembly assembly = Assembly.GetExecutingAssembly(); foreach

我试图消除API中的一个调用,在该调用中最终用户必须在其代码中传递
Assembly.getExecutionGassembly()
,当前我的代码如下所示

public static Dictionary<int, Packet> Packets { get; private set; }

public static void Init()
{
    Assembly assembly = Assembly.GetExecutingAssembly();

    foreach (Type type in assembly.GetTypes())
    {
        if (type.BaseType == typeof(Packet))
        {
             ...
        }
    }
}
它加载一切都很好,这是预期的行为吗?有没有一种方法可以在后台完成这一切,而最终用户永远不必担心Assmebly调用


简而言之-我有一个.dll文件,人们将在他们的项目中使用它,我想从使用.dll的项目中获取所有类,而不是.dll中的所有类

为什么您要限制您的客户机必须在单个程序集中定义它们的
数据包
类?如果客户机希望在不同的程序集中实现不同类型的
数据包
类,该怎么办?如果有人想在运行时生成运行时代码并在运行时创建一个
Packet
类,该怎么办

您的API不应该关心包类在何处或如何定义。它应该只公开一个接口,允许客户端直接注册新的
数据包
类型。这将为客户提供最大的灵活性

现在,应该使用提供者帮助器方法,这样客户端就可以从程序集或服务器注册类型

比如:

class PacketRegistration {
    public void RegisterPacketType(Type packetType) {...}

    public void RegisterPacketType<TPacket>() where TPacket:Packet { 
         RegisterPacket(typeof(TPacket)); 
    }

    public void RegisterPacketTypesFromAssembly(Assembly assembly) {...}

    public void RegisterPacketTypesFromCurrentAssembly() {
        RegisterPacketTypesFromAssembly(Assembly.GetCallingAssembly());
    }
类包注册{
公共无效注册表packetType(类型packetType){…}
public void RegisterPacketType(),其中TPacket:Packet{
注册软件包(TPacket类型);
}
公共无效注册表PackageTypesFromAssembly(程序集){…}
公共无效注册表PackageTypesFromCurrentAssembly(){
RegisterPackageTypesFromAssembly(Assembly.GetCallingAssembly());
}

是否像这样简单?

您可以让他们传递一个数组或类型列表。NET这样做是为了UITypeEditor,它需要知道什么是允许的/不允许的。类似的问题是,它不知道调用是从主程序集还是从DLL调用。在我的API中使用单个程序集的原因是因为它是用于h Unity3D,如果有人在Unity中使用多个程序集,我想让他们教我如何使用。--在大多数情况下,这是一个很好的答案,但根本没有回答这个问题。@Christian.tucker也许你应该问这个问题!
class PacketRegistration {
    public void RegisterPacketType(Type packetType) {...}

    public void RegisterPacketType<TPacket>() where TPacket:Packet { 
         RegisterPacket(typeof(TPacket)); 
    }

    public void RegisterPacketTypesFromAssembly(Assembly assembly) {...}

    public void RegisterPacketTypesFromCurrentAssembly() {
        RegisterPacketTypesFromAssembly(Assembly.GetCallingAssembly());
    }