1

我在便携式区域内执行了一个操作,该操作需要获取有关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,它只是空:

assembly = Assembly.GetEntryAssembly();

我想要做的是Client使用内置框架获取对程序集的引用。显然,我可以使用一些花哨的依赖注入或其他不太复杂的方法来获取该操作的信息;但是,我想知道是否有更好的内置方法来做到这一点。

澄清:我想在这里得到的是客户端程序集的版本信息。我希望每个客户端都可以访问VersionInfoCore区域中的部分并将构建版本信息添加到呈现的页面。因此,操作Core需要知道调用它的程序集,以便它可以反映版本信息。

4

1 回答 1

0

经过大量的努力和泪水,我确定 DI 将是做到这一点的最佳方式。为什么?

关于可移植区域的一些信息
经过一些研究和观察,可移植区域似乎运行在它们自己的 MVC 子实例中。我试图从我的便携式区域调用部分视图存在于我的客户端应用程序的视图中:

@Html.Action("Versions", "Core")

Version如果我在Action in 中提取堆栈跟踪Core,我会得到:

Core.Versions()
在 System.Web.Mvc...
在 System.Web.Mvc...
在 ASP._Page_Views_Shared_Layouts__Base_cshtml.Execute()
在 System.Web.Mvc... 在 ...

由于我的客户端应用程序中的所有控制器代码都已执行,因此堆栈跟踪中甚至不再有对该程序集的引用。我还尝试Assembly在操作中添加一个 arg Versions,例如:

@Html.Action("Versions", "Core", new { assembly = Assembly.GetExecutingAssembly() })

但由此产生的结果App_Web_xq4cmhcy显然是一个生成的程序集。

因此,真正剩下的唯一选择是添加一个 DI 容器,该容器在每个客户端应用程序的 Global.asax 中使用执行程序集进行初始化,然后可由 Core 方法读取。

于 2012-04-10T13:30:34.373 回答