这个问题已经让我头疼了几天,但我找不到原因。我很确定这是我的机器特有的环境问题,但是仍然导致我的测试问题。
我正在使用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位);然后将其注册为COM对象。
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位上。
最佳答案
显然,您正遭受着DLL Hell的困扰,COM始终伴随着它,它正在加载DLL的旧版本。您的GAC可能会受到早期实验的污染,它将始终首先找到GACed版本。通过指定[Guid],使新的类看上去与旧的类相同,即使它并不相同,也会使情况变得更糟。阻止COM告诉您找不到新版本的类。
查看DLL来自哪里的最可靠(虽然嘈杂)的方法是使用SysInterals的ProcMon实用程序。您会看到它读取注册表项并加载DLL。您可以看到它来自哪个目录。确保不是GAC,如果是这种情况,请使用gacutil/u删除它,并通过检查文件上的时间戳来确保重新构建了GAC。
关于c# - 64位类型库和32位类型库不同步,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15223584/