【问题标题】:COM wrapped .Net dll config fileCOM 包装的 .Net dll 配置文件
【发布时间】:2011-04-21 07:30:38
【问题描述】:

我有一个 .net 组件库 (dll),我已经成功地进行了 COM 包装(使用 regasm)。 .net 组件需要配置信息。

在 .Net 世界中,这可以通过 app.config 轻松解决。我可以对这个 dll 进行具体的设置并将它们添加到 web.config 或 exe.config 中,这样当 dll 在程序或网络上使用时,它可以访问必要的配置信息。

所以我的问题是,当通过 COM 调用时(比如通过 ASP 页面甚至 VBScript),我可以以及如何使用配置文件吗?理想情况下,我宁愿不对某些项目进行硬编码。

【问题讨论】:

    标签: .net com configuration interop


    【解决方案1】:

    【讨论】:

    • 如果您“拥有”正在读取配置的内容,并且可以要求它从您返回的对象中读取其配置(与 ConfigurationManager 中的默认配置相反),则此方法有效,但如果它是第 3 方从(例如)ConfigurationManager.AppSettings 读取的组件,这不会替换 AppDomain 启动时读取的配置(或缺少配置)。
    • 马特说的很好。 @rifferte,仅当您可以修改 COM 包装的 dll 代码时,上述解决方案才有效。
    • 我可以修改 COM 包装的代码,所以这是我将采取的方向。谢谢!
    【解决方案2】:

    问题在于,使用默认 COM 激活,您的托管组件在默认 AppDomain 中运行,该 AppDomain 从宿主 .exe 继承其配置名称(例如,如果您在 cscript.exe 中运行,它希望找到 cscript.exe。 exe.config 位于您不拥有的 cscript.exe 旁边)。解决这个问题的最简单方法是创建一个托管 shim,它启动一个新的 AppDomain,然后在那里加载程序集,指定要在 AppDomainSetup 对象中使用的 XXX.dll.config 文件,然后创建并返回该对象新的应用程序域。这基本上意味着您需要创建一个小的托管工厂对象,以确保 .NET 启动并运行并且您的新 AppDomain 已创建(最好只使用一次 - 如果在同一进程中创建第二个对象,则使用现有域),然后返回托管在正确位置的托管对象。如果您愿意编写一个完全实现 COM 类工厂的非托管 shim,则可以使该过程完全透明,但这有点高级...

    【讨论】:

      【解决方案3】:

      COM 对象的调用者/创建者会知道配置文件在哪里吗?比如,公开一个“Load(path)”类型的函数会起作用吗,还是你的意思是不同的?

      【讨论】:

        猜你喜欢
        • 2015-07-24
        • 1970-01-01
        • 2011-12-29
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-13
        • 2010-12-05
        相关资源
        最近更新 更多