这个问题已经让我头痛了几天了,我找不到原因。我很确定这是我的机器特有的环境问题,但它仍然给我的测试带来了问题。
我正在使用Visual Studio2010Professional在C#中创建一个动态链接库。版本一在下面;
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位中工作。见鬼?
发布于 2013-03-05 22:51:24
很明显,你正在遭受DLL地狱的痛苦,总是和COM在一起,它正在加载你的DLL的旧版本。你的GAC可能已经被早期的实验污染了,它总是会首先找到GACed版本。指定Guid会使情况变得更糟,使新类看起来与旧类相同,尽管它并不相同。防止COM告诉您它找不到类的新版本。
要查看DLL的来源,最可靠的方法是使用SysInterals的ProcMon实用程序。您将看到它正在读取注册表项并加载DLL。你可以看到它来自哪个目录。确保它不是GAC,如果是这样,使用gacutil /u删除它,并确保通过检查文件上的时间戳重新构建它。
https://stackoverflow.com/questions/15223584
复制相似问题