使用VS 2008,这是我的COM对象
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace TestCom
{
[Guid("9E5E5FB2-219D-4ee7-AB27-E4DBED8E123E")]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("Test9.COMINT")]
public class TestComClass
{
public void Init(string userid, string password)
{
MessageBox.Show(string.Format("{0}/{1}", userid, password));
}
}
}
如果我构建它并在生产机器上注册如下
REGASM /CODEBASE TESTCOM.DLL
从一个简单的VB6应用程序,这工作正常
Private Sub Form_Load()
Dim o As Object
Set o = CreateObject("Test9.COMINT")
o.Init "A", "B"
End Sub
这个完全相同的代码从Excel中的VBA调用
“自动化错误”(0x80131700)
在开发机器上一切正常,而不是只安装了.NET和MS Office的生产机器。
我认为这与.NET框架在Excel下运行时未正确初始化有关。如果我使用Filemon,我可以看到它跳过寻找MSCORWKS.DLL。当我从VBScript调用同一个对象时,它发现MSCorwks.dll没问题。
当我从VBA调用CorBindToCurrentRunTime
以尝试强制加载CLR时,有趣的是,我得到与在VBA中HRESULT (0x80131700)
时完全相同的CreateObject()
。
因此我认为这是一个框架初始化问题。
答案 0 :(得分:13)
我将回答我自己的问题,希望能让其他人忍受我刚刚忍受的繁琐乏味的工作。
如果你知道这个,是,因为基于.NET的COM程序集找不到.NET框架
解决方案很简单。创建包含以下
的文件<?xml version="1.0"?>
<configuration>
<startup>
<supportedRuntime version="v2.0.50727"/>
</startup>
</configuration>
将其命名为“Excel.Exe.Config”并将其放在与“EXCEL.EXE”相同的目录中
问题解决了!
答案 1 :(得分:2)
安装以下修补程序将解决此问题 http://www.microsoft.com/downloads/details.aspx?FamilyID=1b0bfb35-c252-43cc-8a2a-6a64d6ac4670&displaylang=en
答案 2 :(得分:1)
RC1,我使用VBScript的代码和Office 2007的Excel中的代码测试了这一切,一切正常。
由于你能够在VB6表单中创建COM对象,我们应该假设你的.net框架没问题。你能排除VBA的问题吗?你能创建一个.vbs文件并将其放入其中:
Dim o As Object
Set o = CreateObject("Test9.COMINT")
o.Init "A", "B"
保存文件并双击它。如果你收到错误,那么我认为注册时会出现问题,如果你没有收到错误,那么我会查看Office和VBA,看看是否有东西丢失或者没有正确安装。
另一个选择是添加对COM对象的引用并使用早期绑定?我认为您可能需要先导出一个类型库,但是您应该能够添加一个引用并简单地添加该对象。
答案 3 :(得分:0)
这对VBA来说很有用......我用Word&amp; Excel 2003(SP3)。
我不确定“生产”机器是什么意思。因为这是一个“客户端”应用程序,必须使用Excel在客户端上执行。
如果您在服务器上自动化Excel并通过VBA调用触发此“互操作”,那么您就会遇到麻烦:)
假设通过生产,您指的是用户将使用Excel模板/ doc的客户端计算机,这些是以下指针:
如果您感觉冒险,可以使用进程资源管理器[来自Microsoft sysinternals网站]查看加载的DLL是什么,以及您在哪里得到错误并将其与开发框中的列表进行比较。< / p>
希望这有帮助。
答案 4 :(得分:0)
rc1是正确的,因为 是.net错误,当Office无法决定使用哪个版本的Framework时会抛出.net错误。然而,办公室并没有因为它的选择而受到损害。 Office 2003与.net 2.0的交互方式存在一个错误。
从Microsoft(KB908002)安装修复程序是解决问题的一种更灵活的方法,而不是强制Excel在特定版本的.net中运行。
另请参阅:http://www.biopdf.com/guide/trouble_shoot_microsoft_office_2003.php