我在可移植区域内执行了一个操作,需要获取有关调用它的Assembly
的信息。便携式区域位于项目Core
中,并由客户端应用Client
引用。
GetAssembly
和GetExecutingAssembly
都返回Core
汇编:
// Both are Core
assembly = Assembly.GetAssembly(GetType());
assembly = Assembly.GetExecutingAssembly();
我的下一个想法是使用GetCallingAssembly
,但这会带回Anonymously Hosted DynamicMethods Assembly.
assembly = Assembly.GetCallingAssembly();
唯一的另一个选项是GetEntryAssembly
,它只是null:
assembly = Assembly.GetEntryAssembly();
我想要做的是使用内置框架获取对Client
程序集的引用。显然,我可以使用一些花哨的依赖注入或其他一些不太复杂的方法来获取这个动作的信息;但是,我想知道是否有更好的内置方法来做到这一点。
澄清:我想要的是客户端程序集的版本信息。我希望每个客户端都能访问位于VersionInfo
区域的Core
部分,并将构建版本信息添加到呈现的页面。因此,Core
中的操作需要知道调用它的程序集,以便它可以反映出版本信息。
答案 0 :(得分:0)
经过多次努力和许多眼泪,我已经确定DI将是最好的方法。为什么呢?
关于便携式区域的一些信息
经过一些研究和观察,似乎便携式区域在他们自己的MVC子实例中运行。我尝试从我的便携式区域调用部分视图存在于我的客户端应用程序视图中:
@Html.Action("Versions", "Core")
如果我在Version
的{{1}}操作中提取堆栈跟踪,我会得到:
Core.Versions()
在System.Web.Mvc ...
在System.Web.Mvc ...
在ASP._Page_Views_Shared_Layouts__Base_cshtml.Execute()
在System.Web.Mvc ... 在......
由于我的客户端应用程序中的所有控制器代码都已执行,因此堆栈跟踪中甚至没有对该程序集的引用。我还尝试在Core
操作中添加Assembly
arg,la:
Versions
但结果是@Html.Action("Versions", "Core", new { assembly = Assembly.GetExecutingAssembly() })
,显然是生成的程序集。
所以,真正唯一的选择是添加一个DI容器,该容器在每个客户端应用程序的Global.asax中使用执行程序集初始化,然后可以通过Core方法读取。