【发布时间】:2023-03-14 19:19:01
【问题描述】:
我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但是这需要生成一个与原始 COM 代码相当接近的类型库。
总的来说,一切正常。但是 regasm 生成的 typelib 给出了一个我似乎无法控制的库名称。
生成的 IDL(来自 regasm backcompat.dll /tlb:backcompat.tlb)的顶部如下所示:
// Generated .IDL file (by the OLE/COM Object Viewer)
//
// typelib filename: BackCompat.tlb
[
uuid(BF1F4E76-8F4A-420E-A58A-E041600AC02A),
version(1.0),
helpstring(".NET replacement for legacy VB objects")
]
library BackCompat
{
// TLib : // TLib : mscorlib.dll : {BED7F4EA-1A96-11D2-8F08-00A0C9A6186D}
importlib("mscorlib.tlb");
// TLib : Microsoft ActiveX Data Objects 6.1 Library : {B691E011-1797-432E-907A-4D8C69339129}
importlib("msado15.dll");
// TLib : : {4FB2D46F-EFC8-4643-BCD0-6E5BFA6A174C}
importlib("System.EnterpriseServices.tlb");
.
.
.
我要匹配的具体声明是针对第 10 行的 library,它以 BackCompat(解决方案和 DLL 的名称)的形式出现。
C#代码的命名空间为UtilityLib,VB6中的原始类为UtilityLib.Database、UtilityLib,Guid等;我可以使用 ProgId 属性强制设置 prog ID,但库名称本身似乎难以捉摸。
不幸的是,似乎因为库被声明为BackCompat,所以当尝试链接使用早期绑定的现有 VB6 库时,构建失败,因为他们正在寻找 UtilityLib.{whatever}:所以我必须源代码更改参考BackCompat.{whatever};即,看起来像这样的 VB6 代码:
Dim dbConn As UtilityLib.Database
必须改为:
Dim dbConn as BackCompat.Database
虽然一键更改所有 VB6 非常棒,但这不是一种选择:随着时间的推移,旧版 VB6 组件将被替换并替换为 .NET 组件。
重命名文件似乎并不能解决这个问题,所以它必须从程序集本身获取名称。是否有我可以在AssemblyInfo.cs 中指定的属性来控制它,还是只是修复解决方案本身的情况?
【问题讨论】:
-
我对此知之甚少 - 可以从以前的版本中读取名称并以这种方式延续吗?我似乎记得 VB6 以前对我做过类似的事情。
-
库名与程序集名相同。项目>属性>构建选项卡>“程序集名称”设置。很难弄错,考虑到您的 VB6 项目可能正在引用类型库的旧版本。
-
@Hans:哈——就这样,ta。我想我是代码盲的:鉴于我可以通过方法名称、方法属性、程序集属性等来控制其他所有内容,所以我在不考虑项目设置的情况下寻找几乎相同的东西。干杯。留下您的评论作为答案,我会投票并打勾,ta。
-
我仍然不知道这是怎么出错的。只需发布您自己的答案即可完成问答。
标签: c# vb6 com-interop