Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 2008 来自VBA的WCF客户端_Visual Studio 2008_Wcf_Vba_App Config - Fatal编程技术网

Visual studio 2008 来自VBA的WCF客户端

Visual studio 2008 来自VBA的WCF客户端,visual-studio-2008,wcf,vba,app-config,Visual Studio 2008,Wcf,Vba,App Config,在.NET中,我为我的WCF服务开发了一个客户端库 我已注册COM互操作程序集,以便可以从VBA调用库 但是,由于使用库的可执行文件不是在.NET设置中生成的,因此库函数无法找到定义服务绑定的配置文件(“visual studio项目中的app.config”) 我有没有办法指定配置文件应该位于的路径 谢谢即使您有一个“本机”Win32应用程序,您仍然可以将名为MyApp.exe.config的配置文件放在与应用程序相同的目录中,并且.NET部件应该能够找到并解释该配置文件 你的VB应用程序不会

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

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

但是,由于使用库的可执行文件不是在.NET设置中生成的,因此库函数无法找到定义服务绑定的配置文件(“visual studio项目中的app.config”)

我有没有办法指定配置文件应该位于的路径

谢谢

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

你的VB应用程序不会知道任何关于该配置文件的信息,也不会对它做任何事情,但是你的.NET客户端库会找到并使用它

我用这种技术将C#代码组件集成到本地C++/Win32应用程序中——对我来说,这是一种魅力

它需要一个完全编译的本机EXE文件,此方法才能工作-不确定您的VBA项目是否提供该文件,但是


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

请查看以下方法:


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

这确实有效。不幸的是,我不认为生产级系统应该放置它自己的文件会污染MS Office目录,所以我想找到一个解决方案,允许我选择配置文件的位置。
// 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;