1

有谁知道强制应用程序从单独的文件加载特定的 .NET 类的任何方法,而无需该应用程序的源代码?例如,如果我想对 mscorlib 中的单个类进行更改并查看某个应用程序中发生了什么,我不想为 mscorlib 中的每个单个类创建一个包装 DLL 。让我想到这一点的一件事是因为我非常讨厌Windows 文件夹浏览器对话框,并且我希望能够为 FolderBrowserDialog 编写一个替换类。然后,每当应用程序尝试使用它时,它都会使用我的。

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

4

3 回答 3

1

程序集重定向/发布者策略就是为此目的,但您不太可能将其应用于 mscorlib,尤其是在系统范围内。使用程序集重定向时,可以将给定程序集重定向到同一程序集的不同版本,但目标程序集必须具有与原始程序集相同的公钥令牌。由于 mscorlib 被强命名(在 GAC 中),因此您不太可能在修改后重新签名。

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

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

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

于 2013-10-12T02:26:53.650 回答
0

您可以随时尝试使用ILSpy反编译 dll 。它允许您从任何 .net dll 生成带有源代码的项目文件。

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

于 2013-10-12T04:42:30.447 回答
0

使用 .Net 策略设置可能是可能的。看看这个(摘自 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。

于 2013-10-12T02:25:54.010 回答