Skip to main content
 首页 » 编程设计

c#-4.0之如何实例化未包含在 C# 项目中的对象

2024年08月12日10Leo_wl

注意:所有示例代码都已大大简化。

我有一个 DLL 定义为:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.IO; 
using System.Web; 
 
namespace RIV.Module 
{ 
    public interface IModule 
    { 
        StringWriter ProcessRequest(HttpContext context); 
        string Decrypt(string interactive); 
        string ExecutePlayerAction(object ParamObjectFromFlash); 
        void LogEvent(object LoggingObjectFromFlash); 
    } 
} 

现在,在我的解决方案之外,其他开发人员可以定义具体的类并将它们放入我的应用程序的 BIN 文件夹中。也许是这样的:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using RIV.Module; 
 
namespace RIV.Module.Greeting 
{ 
    public class Module : IModule 
    { 
        public System.IO.StringWriter ProcessRequest(System.Web.HttpContext context) 
        { 
            //... 
        } 
        public string Decrypt(string interactive) 
        { 
            //... 
        } 
        public string ExecutePlayerAction(object ParamObjectFromFlash) 
        { 
            //... 
        } 
        public void LogEvent(object LoggingObjectFromFlash) 
        { 
            //... 
        } 
    } 
} 

现在,在我的应用程序中,我需要知道有一个新模块可用(我猜测是通过 web.config 或类似的东西),然后能够根据数据库 Campaign 表中的某些触发器来调用它(映射到用于该特定事件的模块)。

我正在尝试以这种方式实例化它:

var type = typeof(RIV.Module.Greeting.Module); 
var obj = (RIV.Module.Greeting.Module)Activator.CreateInstance(type); 

但是,编译器会打嗝,因为从未将引用设置为 RIV.Module.Greeting.dll!

我做错了什么?

请您参考如下方法:

您需要使用更多反射:

  • 通过调用 Assembly.Load 加载程序集
  • 通过调用 someAssembly.GetType(name) 或搜索 someAssembly.GetTypes() 查找类型
  • Type 实例传递给 Activator.CreateInstance
  • 将其转换到您的界面。