如何强制应用程序从其他程序集加载.NET类?

时间:2013-10-12 02:14:19

标签: c# .net class redirect

有没有人知道如何强制应用程序从单独的文件加载特定的.NET类,而没有该应用程序的源代码?比方说,如果我想对mscorlib中的单个类进行更改并查看某个应用程序中发生的情况,我不希望为每个类创建一个包装器DLL mscorlib程序。有一点让我想到这一点是因为我绝对讨厌 Windows文件夹浏览器对话框,我希望能够为FolderBrowserDialog编写替换类。然后,只要应用程序尝试使用它,它就会使用我的。

我刚发现TypeForwardedToAttribute,但这需要访问源代码。我希望能够对现有的应用程序执行此操作,我没有任何源代码。

3 个答案:

答案 0 :(得分:1)

Assembly redirection / publisher policy就是出于此目的,但您很可能无法将其应用于mscorlib,尤其是在系统范围内。使用程序集重定向时,可以将给定程序集重定向到同一程序集的不同版本,但目标程序集必须具有与原始程序集相同的公钥标记。由于mscorlib被强烈命名(在GAC中),因此您不太可能在修改后重新签名。

另外,请记住FolderBrowserDialog内部使用SHBrowseForFolder,因此如果您以某种方式设法重定向或重定向mscorlib,您仍然只处理托管应用程序 - 任何本机应用程序仍将使用基础SHBrowseForFolder 1}}调用,你最终会在不同的应用程序中看到不同的文件夹对话框。

此外(在阅读您的评论后)您的用户可能已经熟悉“常规”Browse for folder对话框 - 如果您这样做,可能会给他们一个不同的对话框。我并不是说它是一个很棒的对话框(它不是),但所有应用程序的标准行为对于用户来说比单个具有更好对话框的应用程序更好。

为什么不在自己的项目中创建新的文件夹浏览器对话框?这样做并不难。这是一个article开头 - 它包含指向其他文章的链接,这些文章描述了更改对话框的技术(但仅限于单个应用程序中)。

答案 1 :(得分:0)

可能使用.Net策略设置。检查this(摘自Don Box的优秀 Essential .Net )。特别注意清单2.4和图2.11。唯一的问题是我不确定你是否可以使用这种技术覆盖内置的.Net类和程序集。

清单2.4。设置版本策略

                                                        

版本策略可以在三个级别指定:每个应用程序,每个组件和每台计算机。这些级别中的每一个都有机会处理版本号,其中一个级别的结果作为其下级别的输入。如图2.11所示。请注意,如果应用程序和计算机的配置文件都具有给定程序集的版本策略,则首先运行应用程序的策略,然后通过计算机范围的策略运行生成的版本号,以获取用于查找的实际版本号集会。在此示例中,如果计算机范围的配置文件将Acme.HealthCare的1.3.0.0版重定向到版本2.0.0.0,则在请求版本1.2.3.4时,程序集解析程序将使用版本2.0.0.0,因为应用程序的版本策略映射版本1.2 .3.4至1.3.0.0。

答案 2 :(得分:0)

您始终可以尝试使用ILSpy反编译dll。它允许您使用任何.net dll生成的源代码吐出项目文件。

然后,您可以编辑生成的源代码并编译修改后的dll。

相关问题