rav*_*ven 3 .net versioning vb6 com interop
我有一个.NET(FW 2.0)库,它由COM(vb6)应用程序和.NET应用程序使用.
为COM生成的TLB被注册为由"汇编版本"的前两位组成的版本.例如,1.2.5.7汇编版本成为TLB的1.2版本.这非常不方便,因为有时我想更改第二个数字而不需要重新编译vb6应用程序,但似乎我需要在TLB版本更改时重新编译.
所以,我开始研究文件/汇编的事情,并尝试使用文件版本来识别我的更改,保持程序集版本不变.
这与.NET应用程序一样按预期工作(即它可以正常工作),但vb6不是这样.如果任何第三个数字不同(例如汇编版本1.0.0.0 /文件版本1.0.2.0),每次我尝试创建一个新对象时,我得到一个"自动化错误-2147024894(0x80070002)".
任何人都可以告诉我为什么会这样,如果有任何解决方法?
编辑:对不起,错误代码错误.我不知道438来自哪里,但我发誓我看到它...
编辑(2010-09-14):奇怪的是,如果我用汇编版本1.0.0.0编译,那么即使我重新编译vb6项目,我也得到了"自动化错误".
编辑(2010-09-14,再次):在使用ProcMon和FileMon检查后,在违规代码中似乎没有任何文件访问权限,只有注册表查询,大多数指的是DLL的其他版本.它似乎尝试从1.0.0.0(这是最新的代码)到1.0.1.3的所有先前版本,但不是下一个版本(1.0.2.0).目前,文件版本是1.0.2.1,如果我将程序集版本设置为1.0.2.1,它就可以工作,重新编译并注册它.
编辑(2010-09-15):在GAC中搜索我的.Net DLL版本1.0.1.3时有三个PATH_NOT_FOUND错误(在c:\ windows\assembly\GAC_32,c:\ windows\assembly\GAC_MSIL和c:\ windows\assembly\GAC)还有一些其他错误(大多数是NAME_NOT_FOUND),但似乎在尝试了几个变种之后找到了所有这些错误.问题似乎是它正在搜索DLL的错误版本.
另一个编辑(2010-09-15,仍然):根据Hans Passant的建议,我已经在背景中执行了fuslogvw的违规代码,这些是它抛出的重要行:
日志: DisplayName = E_DataIndex,Version = 1.0.1.3,Culture = neutral,PublicKeyToken = c322af271028978e(完全指定)
日志: Appbase = file:/// C:/ Archivos de programa/Microsoft Visual Studio/VB98 /
日志: AppName = VB6.EXE
日志:在GAC中搜索失败.
编辑:根据汉斯的回答,我是早期绑定并且已经改变了界面的每个Guid.这似乎有效(是的,我知道,我之前应该尝试过这个)...
编辑(2010-09-17):我找到了原始问题的原因:我没有在注册新的TLB之前取消注册TLB,因为我没有更改UUID,所以它一直在搜索安装的最新版本.当然,我的版本控制系统并不是世界上最好的,但是知道这些陷阱我现在还会继续使用它(我对COM和.NET互操作很新).由于"类型不匹配"似乎是另一个无关的问题,我正在删除信息,如果我自己无法解决,我会打开一个新问题.
COM中的版本控制是一个严重的问题.可怕的DLL Hell总是蠢蠢欲动.一个严峻的冷硬规则是,如果更改COM组件的公共接口,则必须为接口提供新的GUID.这可确保使用以前版本的类型库编译的客户端不会意外使用新接口.
不遵循该规则会产生非常难以诊断的问题.服务器的客户端将调用错误的方法.或者是正确的方法,但错误的参数.结果永远不会很好,任何事情都可能发生.如果你很幸运,那么该程序会因AccessViolation而崩溃.但是,这种运气很难获得,它通常只是以非常不可思议的方式出现故障.
从您的问题判断,您不要在接口上使用[Guid]属性,而是将其留给编译器自动生成一个.它是通过考虑[AssemblyVersion]属性来实现的.不同的版本会自动生成不同的GUID.确实,下一步是DLL Hell避免工作,你的VB6程序再也找不到接口了.您将获得可预测的错误消息,而不是随机调用进入杂草.必须重新编译VB6程序才能使用新类型库.
请注意,这是一个非常重要的功能,而不是错误.您可以通过为接口提供[Guid]属性来自行控制它,这样它们就不再依赖于程序集名称或版本.您现在必须在更改界面时手动更改它.当你忘记这样做时,迟早会付出代价.
类型库版本号同样重要.更改公共接口不是简单的构建或修订更改,而是一个彻底的改变.你的COM服务器的客户端必须重新编译.在您的版本号中表达此信息,增加次要版本号或主要版本号.
| 归档时间: |
|
| 查看次数: |
1962 次 |
| 最近记录: |