当通过COM调用时,我可以使用/访问.net代码中的app.config吗?

MPr*_*ard 7 .net com vba app-config

我有一组现有的.net库,我希望从Excel VBA调用(该部分工作正常).这些库依赖于app.config中的设置.我知道我可以在excel.exe.config文件中输入这些设置(放在与excel.exe相同的目录中),但这对我来说似乎不是一个非常易于管理的解决方案,因为我可以看到导致冲突,如果不止一个应用程序想要这样做.

我的问题很简单:COM暴露的dll是否有任何方式引用它们各自的配置文件?

示例app.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="test" value="Hello world!" />
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)

示例c#:

namespace ExcelVbaFacingCode
{
    public class SimpleAppSettingReader
    {
        public string GetValue(string key)
        {
            return ConfigurationManager.AppSettings[key];
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

样本VBA:

Public Sub Test()
    Dim Test As New SimpleAppSettingReader
    Dim sampleValue As String
    sampleValue = Test.GetValue("test")
    MsgBox "Value: '" + sampleValue + "'", vbOKOnly
End Sub
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 1

您确实可以指定 .NET 配置 API 将使用的配置文件,但您必须在创建 AppDomain 之前执行此操作(这并不像听起来那么容易)。这就是 ASP.NET 的工作原理。它将 AppDomain 设置为使用位于虚拟目录中的“web.config”文件,而不是需要 w3p.exe.config 或其他文件。

您也可以执行此操作,但需要创建辅助 AppDomain。这本身就是一个好主意,原因有很多,这些原因与多个加载项和程序集引用有关。但是您可以在AppDomain 设置中放入的内容之一是“app.config”文件的名称/路径。

要创建新的 AppDomain,您可以使用“shim”,它是一些样板 C++ 代码,用于配置和启动 AppDomain,并且从那时起的其余代码可以是托管代码。

MSDN 上有一篇由 Andrew Whitechapel 撰写的文章,名为Isolating Office Extensions with the COM Shim Wizard。我不会撒谎,这不是一个微不足道的概念,但也不算太糟糕。有一个向导可以为您创建 C++ 项目,并将 .NET 插件加载到新的 AppDomain 中。AppDomain 的配置必须在加载之前完成,因此您需要将以下内容放入向导创建的代码中。

// CLRLoader.cpp
HRESULT CCLRLoader::CreateLocalAppDomain()
{

    ... snip ...

    // Configure the AppDomain to use a specific configuration file
    pDomainSetup->put_ConfigurationFile(CComBSTR(szConfigFile));

    ... snip ...

}
Run Code Online (Sandbox Code Playgroud)

还值得注意的是,如果/当您转换为 VSTO 项目时,VSTO 运行时会为您完成所有这些 AppDomain 配置。每个 VSTO 插件都在自己的 AppDomain 中运行,并具有自己的私有 app.config 文件。