从与COM Interop混合的DLL加载配置文件

时间:2012-12-19 11:53:56

标签: .net configuration com-interop

在使用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).

由于

1 个答案:

答案 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。