【问题标题】:WCF client from VBA来自 VBA 的 WCF 客户端
【发布时间】:2010-06-23 12:20:16
【问题描述】:

在 .NET 中,我为我的 WCF 服务开发了一个客户端库。

我已经为 COM 互操作注册了程序集,以便我可以从 VBA 调用库。

但是,由于使用该库的可执行文件未在 .NET 设置中构建,因此库函数无法找到定义服务绑定的配置文件(Visual Studio 项目中的“app.config”)

我有什么方法可以指定配置文件应该存放的路径吗?

谢谢

【问题讨论】:

    标签: visual-studio-2008 wcf vba app-config


    【解决方案1】:

    这样做的正确方法不是直接 COM 激活 WCF 客户端,而是编写一个自定义 shim,它将启动一个新的 AppDomain,在那里创建客户端,并将客户端的 IDispatch 返回给 COM 调用者.一旦你创建了自己的 AppDomain,你可以让它从你喜欢的任何位置加载它的配置文件——这取决于你的托管 shim 来告诉它在哪里。使用 2.0 中引入的 AppDomainManager,您甚至不必编写非托管 shim - 您可以编写一个 100% 托管的小型 ComVisible shim,将您的 WCF 客户端加载到它自己的域中。我已经将这种技术用于必须在 Excel 中运行的许多大型项目(同样的问题 - 将 Excel.exe.config 放入共享位置的格式错误),并且效果很好。

    【讨论】:

      【解决方案2】:

      即使您有一个“本机”Win32 应用程序,您仍然可以将一个名为 MyApp.exe.config 的配置文件放在与该应用程序相同的目录中,并且 .NET 部分应该能够找到并解释该配置文件。

      您的 VB 应用程序不会知道该配置文件的任何信息,也不会对其进行任何操作 - 但您的 .NET 客户端库会找到并使用它。

      我已经使用这种技术将 C# 代码组件集成到本机 C++/Win32 应用程序中 - 对我来说就像是一种魅力。

      此方法需要完全编译的本机 EXE 文件 - 但不确定您的 VBA 项目是否提供该文件...


      如果您不能接受此选项,那么唯一的其他选项实际上就是以编程方式定义和加载配置文件。您无法定义/指定配置文件的位置 - 但您可以在代码中加载特定配置文件并使用它(几乎与默认配置文件相同)。

      查看ConfigurationManager.OpenMappedExeConfiguration 方法:

      // you need to define a ExeConfigurationFileMap that defines what file to use
      ExeConfigurationFileMap exeMap = new ExeConfigurationFileMap();
      exeMap.ExeConfigFilename = @"C:\Application\Default.config";
      
      // then, you need to load that file with the ConfigurationManager
      Configuration exeConfig = 
        ConfigurationManager.OpenMappedExeConfiguration(exeMap, ConfigurationUserLevel.None);
      
      // now you can access parts of that config
      string someValue = exeConfig.AppSettings.Settings["SomeValue"].Value;
      string connStr = exeConfig.ConnectionStrings.ConnectionStrings["Default"].ConnectionString;
      

      【讨论】:

      • 这确实有效。不幸的是,我认为生产级系统不应该用自己的文件污染 MS Office 目录,所以我想找到一个解决方案,让我可以选择配置文件的位置。
      猜你喜欢
      • 2013-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多