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

关于COM.net程序集、regasm、dll、tlb和guid的几个简短问题,com,regasm,Com,Regasm,所有问题都与.net framework 2.0中的.net项目dll有关,该dll将自身公开为COM 1) 如果我们在源代码(typelib、类、接口)中没有指定任何guid,那么谁来生成guid呢?编译器还是regasm 2) GUID值存在于dll、tlb或这两个文件中 3) 任何具有相同源代码的开发人员都会在自己构建或运行regasm的机器上独立生成完全相同的GUI 4) 如果我运行regasm传递现有的dll和tlb文件,如果dll和tlb不匹配会发生什么?Regasm是否使用最新的元

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

1) 如果我们在源代码(typelib、类、接口)中没有指定任何guid,那么谁来生成guid呢?编译器还是regasm

2) GUID值存在于dll、tlb或这两个文件中

3) 任何具有相同源代码的开发人员都会在自己构建或运行regasm的机器上独立生成完全相同的GUI

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

5) 在设置了dll和tlb参数的情况下运行regasm有什么意义? Tlb文件是您部署的一部分,或者最好只部署dll,让regasm动态生成Tlb

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

7) 在regasm注销时,我们需要提供什么?dll?Tlb?二者都如果dll(或tlb)与现有注册表项不匹配,会发生什么情况?如果已经使用tlb选项注册,但我仅使用dll运行regasm unregister,它也会删除TypeLyb条目吗


8) 关于比特率,regasm也将始终在SysWow64下生成条目?Framework64下的regasm与Framework下的regasm相同?

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

谁在生成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完全相同的操作,使用反射枚举程序集中的类型以查找[ComVisible(true)]类型并生成匹配的类型库声明。它所做的额外工作是将类型库的注册表项写入HKLM/Software/Classes/Typelib。这样客户端IDE就可以找到它

在设置了dll和tlb参数的情况下运行regasm有什么意义

“dll参数”的真正含义是什么。如上所述,使用/tlb生成类型库。是否部署类型库取决于它的使用情况,如果不提供客户机代码,则应始终部署它,以便客户机程序员可以使用它。类型库的其他用法是本文的主题。如果您不确定客户端程序员将如何使用您的代码,请始终部署

不是所有信息都已在注册表中吗

注册表中的内容是有限的,只有足够的信息可以找到类型库文件。工厂函数所需的接口、它们的方法签名、GUID和CLSID的描述在类型库中

在regasm注销时,我们需要提供什么

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

regasm也将始终在SysWow64下生成条目

SysWow64不扮演任何角色,请始终避免部署到c:\windows。但是,是的,位性确实很重要,注册表的结构使64位应用程序不会意外地在32位库中创建对象,并在异常情况下死亡。反过来说。32位客户端应用程序将从HKLM/Software/WOW6432Node读取注册表项,如果您使用的是32位版本的注册表项,则只能在那里获取注册表项