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)
您确实可以指定 .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 文件。