这个问题让我头疼了好几天,一直找不到原因。我很确定这是我的机器特有的环境问题,但它仍然给我带来了测试问题。
我正在使用 Visual Studio 2010 Professional 在 C# 中创建一个 DLL。第一版如下;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace TestCOM
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ProgId("TestCOM.Class1")]
[System.Runtime.InteropServices.Guid("803A1B2F-1CDA-4571-9084-87500388693B")]
public class Class1
{
public void showMessage()
{
MessageBox.Show("Hello from TextCom");
}
}
}
这个程序集编译得很好,一切都很好。我运行以下脚本将其注册为 COM 对象(首先是 32 位,然后是 64 位);
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe TestCOM.dll /codebase /nologo /tlb:TestCOM32.tlb
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe TestCOM.dll /codebase /nologo /tlb:TestCOM64.tlb
然后使用以下脚本对其进行测试;
dim tc
set tc = CreateObject("TestCOM.Class1")
tc.showMessage()
我使用 csript 来测试脚本,所以我可以控制它使用的位深度——我用 32 位测试一次,用 64 位测试一次。到目前为止一切都很好。
现在,当我修改原始程序集添加一个功能时,如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace TestCOM
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[System.Runtime.InteropServices.ComVisible(true)]
[System.Runtime.InteropServices.ProgId("TestCOM.Class1")]
[System.Runtime.InteropServices.Guid("803A1B2F-1CDA-4571-9084-87500388693B")]
public class Class1
{
public void showMessage()
{
MessageBox.Show("Hello from TextCom");
}
public void HelloWorld()
{
MessageBox.Show("Hello World!!");
}
}
}
在修改之前,我使用“regasm /unregister”注销了库,它报告了所有类型的注销成功。
当我注册库时,现在进行了更改,原始测试脚本可以完美运行。如果我扩展测试脚本来调用新的 HelloWorld 函数;
在 32 位脚本中,它可以完美运行。在 64 位脚本中,它抱怨 TestCOM.Class1 对象不存在这样的函数
我已经尽我所能尝试了这个,但我无法确定为什么新函数对 32 位调用者可用,但对 64 位调用不可用。
我究竟做错了什么 ?我不知道的 64 位内容是否有缓存,或者需要更改的注册表设置?
要清楚;1. 构建程序集 2. 使用 regasm 注册,一次用于 32,一次用于 64 3. 使用脚本测试 - 一切正常 4. 取消注册库 5. 进行修改,重建 6. 按照步骤 2 注册 7. 测试工作在 32 位, 但不是 64. wtf ?