C# - 生成类型库 - 指定库名称?
C# - Generating typelib - specify library name?
我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个非常接近原始的类型库。
总的来说,一切正常。然而,由 regasm 生成的类型库给出了一个我似乎无法控制的库名称。
生成的 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 属性强制执行程序 ID,但库名称本身似乎难以捉摸。
不幸的是,似乎因为库被声明为 BackCompat
,然后当尝试 link 针对使用早期绑定的现有 VB6 库时,构建失败,因为它们正在寻找 UtilityLib.{whatever}
:所以我必须对源代码进行更改才能参考BackCompat.{whatever}
;即,看起来像这样的 VB6 代码:
Dim dbConn As UtilityLib.Database
必须更改为:
Dim dbConn as BackCompat.Database
虽然一次更改所有 VB6 会很棒,但这不是一种选择:随着时间的推移,旧的 VB6 组件将被换出并替换为 .NET 组件。
重命名文件似乎无法解决这个问题,因此它必须从程序集本身获取名称。是否有我可以在 AssemblyInfo.cs
中指定的属性来控制它,或者仅仅是修复解决方案本身的情况?
正如 Hans 在对问题的评论中提到的:
The library name is the same as the assembly name. Project >
Properties > Build tab > "Assembly name" setting. Pretty hard to get
this wrong, consider that your VB6 project might be referencing an old
build of the type library.
我没有考虑的地方(看了其他的,没有考虑项目设置)。
对于 Visual Studio 2019 中的 C#:入门项目有一个 Properties 文件夹,其中包含 AssemblyInfo.cs。库帮助字符串似乎对应于
[assembly: AssemblyDescription("my project description")]
我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个非常接近原始的类型库。
总的来说,一切正常。然而,由 regasm 生成的类型库给出了一个我似乎无法控制的库名称。
生成的 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 属性强制执行程序 ID,但库名称本身似乎难以捉摸。
不幸的是,似乎因为库被声明为 BackCompat
,然后当尝试 link 针对使用早期绑定的现有 VB6 库时,构建失败,因为它们正在寻找 UtilityLib.{whatever}
:所以我必须对源代码进行更改才能参考BackCompat.{whatever}
;即,看起来像这样的 VB6 代码:
Dim dbConn As UtilityLib.Database
必须更改为:
Dim dbConn as BackCompat.Database
虽然一次更改所有 VB6 会很棒,但这不是一种选择:随着时间的推移,旧的 VB6 组件将被换出并替换为 .NET 组件。
重命名文件似乎无法解决这个问题,因此它必须从程序集本身获取名称。是否有我可以在 AssemblyInfo.cs
中指定的属性来控制它,或者仅仅是修复解决方案本身的情况?
正如 Hans 在对问题的评论中提到的:
The library name is the same as the assembly name. Project > Properties > Build tab > "Assembly name" setting. Pretty hard to get this wrong, consider that your VB6 project might be referencing an old build of the type library.
我没有考虑的地方(看了其他的,没有考虑项目设置)。
对于 Visual Studio 2019 中的 C#:入门项目有一个 Properties 文件夹,其中包含 AssemblyInfo.cs。库帮助字符串似乎对应于
[assembly: AssemblyDescription("my project description")]