2

在通过 COM 互操作使用程序集时,我无法在 .NET 中加载配置设置。

背景:我们在一些服务器上使用了大量的 VBScript 脚本来执行各种任务。通常,它们执行诸如发送电子邮件之类的功能。为了促进这一点,我想创建一个可从 VBScript 创建的 COM 对象,这将有助于其中一些常见的功能集。

因此,我正在尝试创建一个通过互操作公开一些 COM 接口的 .NET 程序集。我设法让这个工作,但后来想外部化(而不是硬编码)一些配置设置。

我正在使用这一行来检索配置:

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 输出:

操作失败。
绑定结果:hr = 0x80070002。该系统找不到指定的文件。

从以下位置加载程序集管理器:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll
在可执行文件 C:\Windows\SysWOW64\cscript.exe 下运行
--- 详细的错误日志如下。

=== 预绑定状态信息 ===
日志:用户 = 我的机器\我
日志:DisplayName = COMObject,版本=1.0.0.0,文化=中性,PublicKeyToken=e9e8071519bd2f03
 (完全指定)
日志:Appbase = file:///C:/Windows/SysWOW64/
日志:初始 PrivatePath = NULL
日志:动态基础 = NULL
日志:缓存基础 = NULL
日志:AppName = NULL
调用程序集:System.Configuration,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a。

LOG:此绑定在默认加载上下文中开始。
LOG:未找到应用程序配置文件。
日志:使用 C:\Windows\Microsoft.NET\Framework\v2.0.50727\config\machine.config 中的机器配置文件。
LOG:之前看到过相同的绑定,但由于 hr = 0x80070002 失败。
ERR:预下载检查期间发生不可恢复的错误(hr = 0x80070002)。

谢谢

4

1 回答 1

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。

于 2012-12-19T16:06:44.797 回答