我在 C# 中创建了一个 .NET 类库,它初始化一些日志记录,发送到外部工具。该库完全独立于任何应用程序,但为了对其进行初始化,我需要对其进行至少一个方法调用。
有没有办法让我将一些东西放入 app.config 中,以自动加载该 dll,并在其中调用一些东西?我可以更改内容以适应任何内容,我不需要支持任何自己的类名或方法名或诸如此类的东西。
请注意,我需要在不对相关应用程序进行任何更改的情况下完成此操作,除非更改 app.config 文件。
这可能吗?如果是这样,我应该看什么?
我在 C# 中创建了一个 .NET 类库,它初始化一些日志记录,发送到外部工具。该库完全独立于任何应用程序,但为了对其进行初始化,我需要对其进行至少一个方法调用。
有没有办法让我将一些东西放入 app.config 中,以自动加载该 dll,并在其中调用一些东西?我可以更改内容以适应任何内容,我不需要支持任何自己的类名或方法名或诸如此类的东西。
请注意,我需要在不对相关应用程序进行任何更改的情况下完成此操作,除非更改 app.config 文件。
这可能吗?如果是这样,我应该看什么?
它可能会被认为是一种 hack,但是如果你在你的 dll 中放置一些继承ConfigurationSection的东西,并将该配置部分添加到你的 app.config 中,这将允许你在配置部分的构造函数中执行代码,从而做很多事情你想要。它当然只会在应用程序启动时被调用一次,但如果我理解你是正确的,那就足够了。
Snoop使用一些 C++ voodoo 来做到这一点。幸运的是,源代码可用 - 查看名为“ManagedInjector”的项目
这让我有一段时间不知道该怎么做。我最初认为这可以通过创建一个自定义 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);
}
这使用反射将另一个应用程序加载到配置日志记录的应用程序中。
注意事项:
string[] args
,您可能需要传入一个空string[]
而不是 anull
作为参数)是的,您可以使用反射来加载程序集的内容