.NET COM 接口方法签名在 Windows 注册表中的位置?
Posted
技术标签:
【中文标题】.NET COM 接口方法签名在 Windows 注册表中的位置?【英文标题】:.NET COM Interface Method Signature Location In Windows Registry? 【发布时间】:2017-08-01 03:38:49 【问题描述】:我的 .NET 程序集的 COM 接口用于定义具有如下签名的方法:
GePoint Point(double X, double Y, double Z);
我改成这样了:
GePoint Point();
使用该库的 AutoCAD VBA(64 位)代码抱怨参数不是可选的,所以我认为它仍然看到第一个签名。我进一步猜测这个签名存在于注册表中的某个地方,但我很容易弄错。由于依赖于只能在 AutoCAD 中加载的 AutoCAD dll,我无法使用 Windows regasm 工具进行注册/取消注册,因此我使用注册服务从 AutoCAD 内部进行:
RegistrationServices rs;
rs = new RegistrationServices();
// To register
rs.RegisterAssembly(Assembly.GetExecutingAssembly(),
AssemblyRegistrationFlags.SetCodeBase);
// To unregister
rs.UnregisterAssembly(Assembly.GetExecutingAssembly());
也许有一种方法可以轻松清除对程序集的所有引用,以及其中定义的类型和方法?
【问题讨论】:
当您重新注册一个 COM 对象(DLL、TLB 等)时,它应该覆盖旧信息(在大多数情况下,像这样的一对一方法签名)。如果没有,则意味着您没有在最初的位置重新注册。也许是 32-64 位的问题?检查这个mariusbancila.ro/blog/2010/06/01/com-and-registry和这个mariusbancila.ro/blog/2010/11/04/32-bit-and-64-bit-com-servers 如果我没记错的话,当您添加对 COM 对象的引用时,VBA 会缓存类型信息。尝试将其从项目中删除,然后将其添加回来。 @IgorTandetnik 相信我,我已经尝试过了,但没有什么效果。 @SimonMourier 查看您对***.com/questions/23487332/… 的接受答案,我似乎需要创建和注册类型库,因为我没有在我的 RegistrationServices 代码中这样做。 VBA 正在使用我通过 regasm 生成的 .tlb 文件,方法是保持接口签名相同并删除对 AutoCAD dll 的所有依赖项。我希望我能成功翻译 VB .NET 代码示例。我想知道VBA是否真的需要tlb?也许只有在需要早期绑定的情况下? @BH - 我不知道 AutoCAD 是如何工作的,但是是的,有可能您曾经使用 regasm 或其他东西注册了一个类型库,之后就再也没有更新过它。 VBA 并不严格要求类型库,但如果有,它将使用它。如果您在 VBA 主机中为您的对象提供智能感知支持(例如 Excel,或者如果它使用 VBA,则可能是 AutoCAD),您可以查看是否注册了类型库。如果你有一个类型库,那么你的代码必须调用 RegisterTypeLib。 【参考方案1】:方法签名不存储在注册表中。注册表通常具有 COM 组件的位置。
您可以使用regsvr32 注册您的 COM 组件吗?
Regsvr32 是一个命令行实用程序,用于注册和注销 OLE 控件,例如 Windows 注册表中的 DLL 和 ActiveX 控件
以管理员权限打开命令提示符并运行Regsvr32 path/to/your/com dll
然后您可以检查您的程序是否正在获取新的方法签名。
【讨论】:
我不能使用 regsvr32,因为正如我所说,我的程序集依赖于只能在 AutoCAD 中加载的 AutoCAD dll。但是,通过删除 AutoCAD 依赖项并仅拥有一个骨架类,我能够注册到 regsvr32 并构建 typelib 文件 (.tlb)。这就是我创建问题的方式 - 然后我改变了对方法签名等的想法。我已经弄清楚了这一切并且现在正在工作,所以我会在有时间时发布一个解决方案。 我还可以确认您的说法,即方法签名未存储在注册表中 - 可能存储在 tlb 文件中。 tlb 文件位置存储在注册表中,正如我发现的那样,您可以通过移动或删除它来使所有代码相当生气。以上是关于.NET COM 接口方法签名在 Windows 注册表中的位置?的主要内容,如果未能解决你的问题,请参考以下文章
.NET 签名到 p/invoke GetSystemDEPPolicy 函数