[英]We have two version of the same assembly in GAC? I want my client to make choice of which assembly to choose?
[英]Which assembly do I want?
我正在编写一个Web框架,并且正在实现一些自定义属性。 我想获取所有这些属性,以便可以对它们进行处理。 我想这样做,我首先需要获取程序集,然后可以获取其中定义的所有类型(类),然后可以获取其所有方法,最后是属性。
所以,我在看Assembly.Get___Assembly
。 我要使用呼叫,输入还是执行? 该网络框架将被编译成其自己的程序集DLL,然后使用该框架的人员应包括该DLL,并使用来自Web框架程序集的属性来实现自己的类。
所以...我当时想执行将给我Web框架DLL,因为那是属性处理代码所在的位置,而不是属性使用的位置,所以那不是我想要的。
EntryAssembly听起来很有希望...但是它正在IIS上运行...。那么它将返回什么?
而且CallingAssembly听起来很不对劲...那我要哪个呢?
目前,我还没有将webframework分成自己的程序集,所以我有点想在一个程序集中同时构建一个web应用程序和一个web框架。
因此, ExecutingAssembly
确实可以正常工作(暂时),但恐怕将其分离出来会给我错误的提示。
无论出于何种原因, EntryAssembly
CallingAssembly
给出System.Web
,而EntryAssembly
为null。
如果用此属性修饰的所有元素都与调用代码在同一程序this.GetType().Assembly
,则可以仅使用this.GetType().Assembly
(或typeof(CurrentType).Assembly
for typeof(CurrentType).Assembly
)。
另一种常见情况是获取应用程序中所有属性装饰的元素,而无需考虑程序集,这可以通过AppDomain.CurrentDomain.GetAssemblies()
轻松完成。
我认为这里最安全的选择是让框架的用户指定所需的程序集:
SomeClass.RegisterAssembly(this.GetType().Assembly);
(其中在您的框架中定义了SomeClass
)
这是我最终用来获取所有属性的代码:
*剪断*
新版本:
private static IEnumerable<Route> GetInlineRoutes()
{
var methods = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a =>
a.GetTypes()
.Where(t => t.IsClass && t.IsSubclassOf(typeof (Controller))))
.SelectMany(c => c.GetMethods(BindingFlags.Public | BindingFlags.Instance));
return from method in methods
let urlAttributes = method.GetCustomAttributes(true).OfType<UrlAttribute>()
from attr in urlAttributes
select new Route(attr.Pattern, method, attr.Priority);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.