代码之家  ›  专栏  ›  技术社区  ›  Lasse V. Karlsen

是否可以通过app.config将.NET dll“注入”到另一个.NET应用程序中?

  •  3
  • Lasse V. Karlsen  · 技术社区  · 15 年前

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

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

    注意,我需要在不更改相关应用程序的情况下完成此操作,保存以更改app.config文件。

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    这使我有一段时间对如何做感到困惑。我最初认为可以通过创建一个自定义的WebProxy来配置日志记录,并使用 defaultProxy 配置元素。但是,这与其他配置建议的问题相同,因为代码仅在需要时运行(在这种情况下,使用HTTP请求时),因此需要更改原始应用程序。

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

    举个例子:

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

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

    在存根应用程序(作为控制台应用程序)中,我配置日志记录,然后加载并运行 EXE :

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

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

    Caveats:

    • 另一个应用程序必须是.NET应用程序才能以这种方式加载它
    • 您可能需要使用Reflector检查另一个应用程序,以计算出传递到入口点的正确参数(即如果需要 string[] args ,您可能需要传入一个空的 string[] 而不是 null 作为论据)
    • 当其他应用程序运行时,原始应用程序的控制台窗口将挂起(这可能不是问题,但如果是,可以尝试使用隐藏它 FreeConsole )
        2
  •  2
  •   Klaus Byskov Pedersen    15 年前

    它可能被认为是黑客,但如果你把继承的东西 ConfigurationSection 在您的dll中,并将该配置节添加到app.config中,这将允许您执行配置节的构造函数中的代码,从而执行您希望执行的大部分操作。当然,它只能在应用程序启动时调用一次,但如果我理解您的正确性,那就足够了。

        3
  •  1
  •   Rob Fonseca-Ensor    15 年前

    Snoop 这是使用一些C++伏都教吗?幸运的是,源是可用的-在名为“managedInjector”的项目中查找

        4
  •  0
  •   Anton Setiawan    15 年前

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