3

我在 C# 中创建了一个 .NET 类库,它初始化一些日志记录,发送到外部工具。该库完全独立于任何应用程序,但为了对其进行初始化,我需要对其进行至少一个方法调用。

有没有办法让我将一些东西放入 app.config 中,以自动加载该 dll,并在其中调用一些东西?我可以更改内容以适应任何内容,我不需要支持任何自己的类名或方法名或诸如此类的东西。

请注意,我需要在不对相关应用程序进行任何更改的情况下完成此操作,除非更改 app.config 文件。

这可能吗?如果是这样,我应该看什么?

4

4 回答 4

2

它可能会被认为是一种 hack,但是如果你在你的 dll 中放置一些继承ConfigurationSection的东西,并将该配置部分添加到你的 app.config 中,这将允许你在配置部分的构造函数中执行代码,从而做很多事情你想要。它当然只会在应用程序启动时被调用一次,但如果我理解你是正确的,那就足够了。

于 2010-02-03T13:19:11.830 回答
1

Snoop使用一些 C++ voodoo 来做到这一点。幸运的是,源代码可用 - 查看名为“ManagedInjector”的项目

于 2010-02-03T13:38:07.243 回答
1

这让我有一段时间不知道该怎么做。我最初认为这可以通过创建一个自定义 WebProxy 来配置日志记录,并使用defaultProxy配置元素将其加载到主应用程序中来实现。然而,这与其他配置建议存在相同的问题,即代码仅在需要时运行(在这种情况下,当使用 HTTP 请求时) - 因此需要更改原始应用程序。

我通过反转方法实现了它。您可以编写一个应用程序的存根来配置日志记录,然后启动原始应用程序,而不是尝试让原始应用程序配置日志记录。

举个例子:

我有一个名为 WinForms 的应用程序Forms.exe,其入口点定义为:

[STAThread]
internal static void Main()
{
    Application.Run(new MainForm());
}

在我的存根应用程序(我有一个控制台应用程序)中,我配置了日志记录,然后加载并运行Forms.exe

internal static void Main()
{
    ConfigureLogging()
    Assembly app = Assembly.LoadFrom(@".\Forms.exe");
    app.EntryPoint.Invoke(null, null);
}

这使用反射将另一个应用程序加载到配置日志记录的应用程序中。

注意事项:

  • 另一个应用程序必须是 .Net 应用程序才能以这种方式加载它
  • 您可能需要使用 Reflector 来检查其他应用程序以计算出正确的参数以传递给入口点(即,如果需要string[] args,您可能需要传入一个空string[]而不是 anull作为参数)
  • 原始应用程序的控制台窗口将在其他应用程序运行时挂起(这可能不是问题,但如果是,您可以尝试使用FreeConsole隐藏它)
于 2010-02-03T23:36:48.070 回答
0

是的,您可以使用反射来加载程序集的内容

于 2010-02-03T13:15:26.520 回答