在使用COM interop上的程序集时,我无法在.NET中加载配置设置。
背景: 我们在一些服务器上使用大量VBScript脚本,执行各种任务。通常,它们执行诸如发送电子邮件之类的功能。为了实现这一点,我想创建一个可以从VBScript创建的COM对象,这将有助于这些常见的功能集。
因此,我正在尝试创建一个.NET程序集,通过interop公开一些COM接口。我设法让这个工作,但后来想要外化(而不是硬编码)一些配置设置。
我正在使用此行来检索配置:
ConfigurationManager.OpenExeConfiguration(this.GetType().Assembly.Location)
当我从测试项目中测试它并将其作为.NET项目引用时,这似乎没有问题,但如果我将它作为COM对象进行测试,它就会失败。
失败的原因是在我的配置文件中,我有一个自定义部分:
<section name="CustomSection" type="COMObjects.CustomSection, COMObject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e9e8071519bd2f04"/>
但是,当它尝试加载自定义部分时,无法加载程序集“COMObject”。对我而言,这是有道理的,因为我没有将程序集放在GAC中(我也不想),所以它很难找到它。
有没有办法帮助.NET框架找到配置文件中引用的程序集以用于这样的场景?
以下是绑定的fuslogvw.exe输出:
The operation failed. Bind result: hr = 0x80070002. The system cannot find the file specified. Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll Running under executable C:\Windows\SysWOW64\cscript.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = My-MACHINE\ME LOG: DisplayName = COMObject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=e9e8071519bd2f03 (Fully-specified) LOG: Appbase = file:///C:/Windows/SysWOW64/ LOG: Initial PrivatePath = NULL LOG: Dynamic Base = NULL LOG: Cache Base = NULL LOG: AppName = NULL Calling assembly : System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. LOG: This bind starts in default load context. LOG: No application configuration file found. LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config. LOG: The same bind was seen before, and was failed with hr = 0x80070002. ERR: Unrecoverable error occurred during pre-download check (hr = 0x80070002).
由于
答案 0 :(得分:3)
在可执行文件C:\ Windows \ SysWOW64 \ cscript.exe
下运行
此代码由32位版本的脚本解释程序激活。 CLR将查找程序集的位置受启动EXE位置的影响。它设置AppBase
的值,它不可避免地指向Windows目录,因为这是存储cscript.exe的地方。找到程序集的唯一方法是将其复制到c:\ Windows \ SysWow64中。这不合理,该目录由操作系统拥有。
可以通过app.exe.config文件<probing>
元素配置专用路径。它是有限的,您只能选择AppBase的子目录。在c:\ Windows \ SysWOW64中创建子目录是不合理的事情。创建script.exe.config文件将影响由cscript执行的所有脚本。这不是一件合理的事情。
.NET框架为像这样的程序集解析问题提供了一个非常合理的替代方案。你已经知道了,这是你不想做的事情。该程序集属于GAC。