5
  • 我有 .NET 程序集,其中一些类标记为ComVisible
  • 该程序集已注册regasm /codebase "assembly_path"
  • 我有 app.config 名称(实际上是 - MyAssemblyName.dll.config),它位于程序集的文件夹中
  • 我通过访问我的程序集中的 appSettingsConfigurationManager.AppSettings["SettingName"]
  • 我有 VBScript 文件,它通过CreateObject("...")
  • 创建对象时(从 VBScript),ConfigurationManager.AppSettings["SettingName"]返回 null。看起来程序集没有看到配置文件。

我应该怎么做才能使它可行?

4

4 回答 4

5

正如 Komyg 所说,一种可能的方法是直接读取配置文件,而不是使用 ConfigurationManager 的嵌入式行为。对于那些会有同样问题的人:而不是

ConfigurationManager.AppSettings["SettingName"]

您可以使用:

var _setting = ConfigurationManager.AppSettings["SettingName"];
// If we didn't find setting, try to load it from current dll's config file
if (string.IsNullOrEmpty(_setting))
{
    var filename = Assembly.GetExecutingAssembly().Location;
    var configuration = ConfigurationManager.OpenExeConfiguration(filename);
    if (configuration != null)
        _setting = configuration.AppSettings.Settings["SettingName"].Value;
}

这样,您将始终使用YourAssemblyName.dll.config位于程序集文件夹中的文件中的读取设置。它还允许您使用其他功能app.config(如appSetting'sfile属性),如果您将使用 XPath 或类似的东西,这些功能将不可用。

于 2011-12-28T13:43:27.680 回答
3

我有同样的问题。需要 app.config 文件的资源管理器外壳扩展(Com 可见,通过 regasm /codebase 注册)既找不到连接字符串,也找不到设置。

我做了什么:

string assemblyLoc          = GetType().Assembly.Location;
string configName           = assemblyLoc + ".config";
AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", configName);

假设配置文件存储在与程序集相同的目录中。

于 2012-06-05T09:40:44.273 回答
1

我使用了 sputnik 的答案,在一个 IIS 测试环境中工作得很好,但在另一个环境中却不行。事实证明,设置 APP_CONFIG_FILE 属性后,您可能需要使用反射来触摸 ConfigurationManager 类以使更改生效。我在设置 APP_CONFIG_FILE 属性后使用了这个函数:

    private static void ResetConfiguration()
    {
        typeof(ConfigurationManager)
            .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static)
            .SetValue(null, 0);

        typeof(ConfigurationManager)
            .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static)
            .SetValue(null, null);

        typeof(ConfigurationManager)
            .Assembly.GetTypes()
            .Where(x => x.FullName == "System.Configuration.ClientConfigPaths")
            .First()
            .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static)
            .SetValue(null, null);
    }

除此之外,最好先保存属性,然后在完成后恢复它:

string oldConfigName = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
        //do custom stuff in here
        AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfigName); //re-point to the original configuration.
        ResetConfiguration();
于 2014-10-08T23:10:00.370 回答
0

是否所有内容都在同一个文件夹中(您的 dll、vb 脚本、配置文件等)?如果没有,您可以尝试在 PATH 环境变量中添加配置文件的完整路径...

此外,如果您在 Internet Explorer 中运行此 VB 脚本,您可能会遇到一些安全问题(通常 IE 不允许您访问硬盘驱动器)。在这种情况下,您可以尝试将配置文件放在桌面上,我不知道为什么,但这似乎是运行 ActiveX 程序时的默认路径,因此对于 VB 脚本也可能如此。

最后,您可以为您的 dll 添加一些调试,例如创建一个简单的文本文件并在之后查找它,这样您就可以看到您的系统实际上在哪里运行您的库。

于 2011-12-28T13:23:50.737 回答