C#关于反射加载的问题

三个程序集: 
主程序集:BaseApp.exe 
接口程序集:IBaseApplication 
插件程序集:TestAttri 
======================================================================================= 
在接口程序中: 
接口:IApp 
属性定义:ModuleAttribute

复制代码代码如下:

public interface IApp : IMothed 

void ParentForm(IApp frm); 

namespace IBaseApplication.Attributes 

[AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Interface | AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Property, AllowMultiple = true, Inherited = false)] 
public class ModuleAttribute : Attribute 

public string IdName { get; set; } 
public string ModuleName { get; set; } 
public Type ModuleType { get; set; } 
//public string AsmName { get; set; } 
//public string ClassName { get; set; } 
public string Description { get; set; } 

}

在插件程序集中: 
在该插件程序集中的AssemblyInfo类中标识如下

复制代码代码如下:

[assembly: IBaseApplication.Attributes.Module(ModuleType = typeof(UserControl1), IdName = "be4d9a5b-0455-4e9d-a255-25122b80bef1-UserControl1", ModuleName = "UserControl1", Description = "")] 
[assembly: IBaseApplication.Attributes.Module(ModuleType = typeof(UserControl2), IdName = "be4d9a5b-0455-4e9d-a255-25122b80bef1-UserControl2", ModuleName = "UserControl2", Description = "")]

有两个模块分别是以下

复制代码代码如下:

namespace TestAttri 

public partial class UserControl1 : UserControl, IApp 

…… 


namespace TestAttri 

public partial class UserControl2 : UserControl, IApp 

…… 

}

================================================================================================= 
在主程序集中: 
将插件放至到:Application.StartupPath + "\\Plus" 
引用了接口程序集“IBaseApplication”

复制代码代码如下:

/// <summary> 
/// 获取插件文件名称 
/// </summary> 
/// <returns></returns> 
public string[] GetPlusFiles() 

return System.IO.Directory.GetFiles(Application.StartupPath + "\\Plus"); 

/// <summary> 
/// 加载插件 
/// </summary> 
public void LoadPluFiles() 

string[] files = GetPlusFiles(); 
Assembly assembly = Assembly.GetCallingAssembly(); 
foreach (string file in files) 

ModuleAttribute[] attributes = Assembly.LoadFile(file).GetCustomAttributes(typeof(ModuleAttribute), false) as ModuleAttribute[]; 
foreach (ModuleAttribute attribute in attributes) 

string m = attribute.ModuleType.FullName; 
string m1 = attribute.ModuleType.Assembly.GetName().Name; 
object obj = Activator.CreateInstance(attribute.ModuleType); 
if (obj is IApp) 
{//无法识别两个模块的接口。 



}

C#关于反射加载的问题

时间: 2024-12-12 11:23:21

C#关于反射加载的问题的相关文章

Quartz.net 2.x 学习笔记03-使用反射加载定时任务

将定时任务信息存储在XML文件中,使用反射加载定时任务 首先新建一个MVC的空站点,使用NuGet添加对Quartz.net和Common.Logging.Log4Net1213的引用,同时使用NuGet管理器控制台执行命令更新log4net,PM> update-package log4net 接着在解决方案中添加一个类库Library项目 类库项目也添加对Quartz.net的引用 下面可以编写代码了,在Library类库中添加一个JobBase类,3个Job类,和一个Job管理类(假设分别

仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?

原文:仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢? 平时我们获取一个程序集或者类型的 Attribute 是非常轻松的,只需要通过 GetCustomAttribute 方法就能拿到实例然后获取其中的值.但是,有时我们仅为反射加载一些程序集的时候,获取这些元数据就不那么简单了,因为我们没有加载目标程序集中的类型. 本文介绍如何为仅反射加载的程序集读取 Attribute 元数据信息. 本文内容 仅反射加载一个程序

利用反射加载类

反射:java.lang.reflect 要被加载的类: package eg.fortest; public class WaitingforLoader { private String str; static{ System.out.println("loading WaitingforLoader"); } public WaitingforLoader() { str="empty"; System.out.println("Constructo

C#使用反射加载多个程序集

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法. 创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); } 在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里.右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹. 创建类库项目Assembly1,添加对控制台项目的引用,并创建实

Unity3D Android动态反射加载程序集

这种办法在iOS下是不让用的,只能在Android下用.用起来也很方便了. 1.先创建一个c#工程,引用到的UnityEngine.dll在Unity的安装目录里找吧 2.将编译的dll放入Unity工程,并打成assetBundle.(要把缀名改成.bytes,这个类型Unity才识别,才能打成assetbundle) 打bundle代码 #if UNITY_EDITOR [MenuItem("GameObject/BuildAsset")] static void BuildAss

程序集加载与反射(二):实战篇

目录: 上篇:http://www.cnblogs.com/sunchong/p/4550476.html Demo 一.Demo 下面这个Demo,使用了策略模式模仿了一下插件机制.我们举个一邮件发送的例子: 1.一个策略类库:Strategy,里面定义了邮件需要实现的接口:IEmailStrategy. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sys

程序集加载与反射(二):实例篇

目录: 上篇:程序集加载与反射(一):基础篇 Demo:下载 一.Demo 下面这个Demo,使用了策略模式模仿了一下插件机制.我们举个一邮件发送的例子: 1.一个策略类库:Strategy,里面定义了邮件需要实现的接口:IEmailStrategy. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespa

反射(一)动态加载类

反射是什么?当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻,比如我们的项目底层有时是用mysql,有时用oracle,需要动态地根据实际情况加载驱动类,通过类的全类名让jvm在服务器中找到并加载这个类,根据需求来改变传入的参数.这时候就可以看到反射的好处了. 通过反射加载一个类,创建对象和调用方法: //根据类的包名+类名加载一个类 Class<?> c = Class.forName("

Hibernate Dao映射配置通用接口类反射获取加载calass实例

接口: package com.ph.dao; import java.io.Serializable; import java.util.List; import org.hibernate.criterion.DetachedCriteria; public interface BaseDao<T> { public void save(T t); public void delete(T t); public void update(T t); public T findById(Ser