关于COM .net程序集,regasm,dll,tlb和guids的几个简短问题

问题描述 投票:1回答:1

所有问题都与.net framework 2.0中的.net项目dll相关,它将自身公开为COM。

1)如果我们没有在生成GUID的源代码(typelib,classes,interfaces)中指定任何GUID?编译器还是regasm?

2)GUID值存在于dll,tlb或两个文件中?

3)任何具有相同源代码的开发人员将在她构建或运行regasm的机器上独立生成相同的GUID?

4)如果我运行regasm传递现有的dll和tlb文件,如果dll和tlb不匹配会发生什么? Regasm使用uptodate元素和GUID重新生成tlb文件?或者它将TypeLib与当前的tlb文件一起注册?

5)设置dll和tlb参数运行regasm有什么意义? Tlb文件是您部署的一部分,或者最佳做法是仅部署dll并让regasm动态生成tlb?

6)最后一个问题,是否真的需要tlb?有一个tlb文件有什么意义?是不是已经在注册表中的所有信息?它提供了什么额外信息?

7)当用regasm取消注册时,我们需要提供什么?这个DLL? Tlb?都?如果dll(或tlb)与现有的reg条目不匹配会发生什么?如果已经使用tlb选项注册但是我只使用dll运行regasm unregister它会删除TypeLyb条目吗?

8)关于位数,regasm也会在SysWow64下生成条目吗? Framework64下的regasm与Framework下的一致吗?

com regasm
1个回答
5
投票

类型库与.NET元数据完全等效。它对客户端程序员来说最有用,它使编译器和IDE智能化您的库。提供自动完成和语法检查,因此他的代码与您的代码之间不匹配的可能性很小。注册步骤是必要的,因此可以找回您的文件。类型库通常作为资源嵌入DLL本身,如.NET元数据,但.NET构建模型并不容易。客户端编译器使用类型库信息来生成适当的COM调用。 Guids是一个大问题,因为这是客户端编译器需要使用的,标识符名称不起作用。有一种方法可以使用名称使用“后期绑定”,与.NET中的Reflection完全等效,但不涉及类型库。

谁在生成GUID?

CLR确实如此。每个.NET接口或类都有一个,无论它是[ComVisible(true)]。也通过Type.GUID属性公开。如果你没有在类型上使用[Guid]属性,那么它会运行一个算法来生成使用类型声明作为输入的Guid。或者换句话说,如果您对类型进行任何更改,那么您可以确定Guid将具有不同的值。哪个是你永远不应该使用[Guid]属性的基本原因,除非你必须创建一个精确的直接替换,并且不能重新编译客户端代码。 TLBID来自创建项目时自动生成的AssemblyInfo.cs文件。

在dll,tlb或两个文件中?

它只在您使用[Guid]属性时存在于DLL中,但通常它是在运行时生成的,如上所述。它始终存在于类型库中,客户端编译器知道如何创建类的对象并使用其接口。

会生成完全相同的GUID

是的,只有类型声明才起作用。

如果我运行regasm传递现有的dll和tlb文件

Regasm只能创建一个类型库,按照其/ tlb选项的要求,它不能使用现有的类型库。否则它与Tlbexp.exe完全相同,使用Reflection枚举程序集中的类型以查找[ComVisible(true)]并生成匹配类型库声明。它所做的额外工作是将类型库的注册表项写入HKLM / Software / Classes / Typelib。因此客户端IDE可以找回它。

使用dll和tlb参数设置运行regasm有什么意义?

“dll参数”没有真正的想法可能意味着。如上所述,使用/ tlb生成类型库。是否部署类型库取决于它的用法,如果您还不提供客户端代码,则应始终部署它以便客户端程序员可以使用它。类型库的其他用法是this post的主题。如果您不确定客户端程序员将如何使用您的代码,那么请始终部署。

是不是已经在注册表中的所有信息?

注册表中的内容是有限的,只有足够的信息才能找回类型库文件。接口的描述,方法签名,guid和工厂函数所需的CLSID在类型库中。

当用regasm取消注册时,我们需要提供什么?

与注册完全相同,您只需添加/取消注册。如果您之前使用过,则还必须提供/ tlb,以便可以删除TypeLib注册表项。在您忙于开发和测试库时自动执行此操作非常重要,因为guid通常是自动生成的,您可以在注册表中产生大量垃圾。当你忘记运行Regasm时,还有丑陋的头脑。项目>属性>构建选项卡,“注册COM互操作”复选框。但有一个缺点,你必须运行VS提升,以便它可以写入注册表。

regasm也会在SysWow64下生成条目吗?

SysWow64不起作用,总是避免部署到c:\ windows。但是,比特确实很重要,注册表是结构化的,因此64位应用程序不会意外地在32位库中创建一个对象而死于一个丑陋的异常。反过来说。 32位客户端应用程序将从HKLM / Software / WOW6432Node读取注册表项,只有您使用32位版本的Regasm才能获得注册表项。值得注意的是,考虑到C#代码可以在任何平台上运行,运行两种版本的Regasm通常都很好。

© www.soinside.com 2019 - 2024. All rights reserved.