如何以编程方式从 .NET 中注册类型库(设置正确的路径)?

2023-12-11

使用.NET 4.0,我制作了一个支持COM的DLL(我们称之为example.dll),并且我已经注册它并使用regasm.exe生成了相应的类型库(regasm.exe /tlb /codebase example.dll);该类型库称为 example.tlb。该程序集具有强名称。

到目前为止,这是有效的,我可以在 VBA 中使用 DLL 和 TLB。

但由于某些原因,我需要制作自己的实用程序来执行 DLL 注册和 TLB 生成。基本上,该实用程序将与 DLL 位于同一目录中,并且应该注册它在该目录中找到的 DLL,并从它在该目录中找到的 DLL 生成 TLB 文件。

DLL 注册和 TLB 生成似乎可以工作,但存在以下问题:我还没有找到任何可接受的方法来从 .NET 4.0 中设置 TLB 文件的正确路径,这就是我将非常感激的一点帮助。

为了重现和说明,想象以下情况:

  • 我有 c:\test_1\example.dll,将目录更改为 c:\test_1 并运行 regasm.exe /tlb /codebase example.dll。据我所知,这至少做了这些事情:它注册 DLL,创建 TLB (c:\test_1\example.tlb) 并以某种方式注册 TLB 本身(请参见下面我的意思)。

  • 现在,我将 DLL 移至 c:\test_2,将注册和 TLB 生成实用程序放入 c:\test_2,将目录更改为 c:\test_2 并运行我的实用程序。显然,DLL 已正确注册,并且 TLB 已生成。但 TLB 不是挂号的(见下文)。

我现在的问题是如何从 .NET 中注册 TLB。

通过注册 TLB,我的意思是:当使用如上所示的 regasm.exe 时,它​​显然会将 TLB 的路径放入注册表中(至少,我在那里找到了它)。当您使用 oleview.exe 查看相应的类型库时,它会显示该路径。当我使用自己的实用程序进行注册和 TLB 生成时,该路径不会更新 - 该路径始终是最后运行 regasm.exe 时设置的路径。

这会导致无法找到TLB的情况,例如:将 DLL 和我的实用程序移动到另一个目录并运行该实用程序后,通过 Excel 进行操作。

这是实用程序源代码的相关部分(VB.net、错误处理和用户界面已删除):

sub Register()

  Dim s_Path As String
  Dim asm_DLL As [Assembly]
  Dim rs_DLL As RegistrationServices
  Dim tlc_DLL As TypeLibConverter
  Dim ns_DLL As cls_TLBCreatorNotifySink
  Dim tlb_DLL As UCOMICreateITypeLib

  s_Path = Application.StartupPath & "\example.dll"

  asm_DLL = Assembly.LoadFrom(s_Path)

  rs_DLL = New RegistrationServices()
  rs_DLL.RegisterAssembly(asm_DLL, AssemblyRegistrationFlags.SetCodeBase)

  s_Path = Application.StartupPath & "\example.tlb"
  ns_DLL = New cls_TLBCreatorNotifySink
  tlc_DLL = New TypeLibConverter
  tlb_DLL = CType(tlc_DLL.ConvertAssemblyToTypeLib(asm_DLL, s_Path, TypeLibExporterFlags.None, ns_DLL), UCOMICreateITypeLib)
  tlb_DLL.SaveAllChanges()

end sub


Public Class cls_TLBCreatorNotifySink

  Implements ITypeLibExporterNotifySink

  Public Sub ReportEvent(eventKind As System.Runtime.InteropServices.ExporterEventKind, eventCode As Integer, eventMsg As String) Implements System.Runtime.InteropServices.ITypeLibExporterNotifySink.ReportEvent

  End Sub

  Public Function ResolveRef(assembly As System.Reflection.Assembly) As Object Implements System.Runtime.InteropServices.ITypeLibExporterNotifySink.ResolveRef

    Return Nothing

  End Function

End Class

我希望我能够足够清楚地表达问题。我的问题归结为.NET 中是否有一个合理的方法使我能够在注册表中设置 TLB 的路径,或者我是否必须直接操作注册表中的相应条目(这很愚蠢,因为没有人知道是否下一个 Windows 版本使用相同的条目);一个额外的好处是知道 regasm.exe 是如何做到这一点的。


你应该打电话寄存器类型库结果是ConvertAssemblyToTypeLib,像这样:

RegisterTypeLib(tlc_DLL.ConvertAssemblyToTypeLib(asm_DLL, s_Path, TypeLibExporterFlags.None, Nothing), s_Path, Nothing)

<DllImport("oleaut32.dll")> _
Private Shared Function RegisterTypeLib(<MarshalAs(UnmanagedType.Interface)> ByVal ptlib As Object, <MarshalAs(UnmanagedType.LPWStr)> ByVal szFullPath As String, <MarshalAs(UnmanagedType.LPWStr)> ByVal szHelpDir As String) As Integer
End Function
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以编程方式从 .NET 中注册类型库(设置正确的路径)? 的相关文章

  • 如何在 .NET 中轻松取消转义 XML 实体

    我有一些代码返回 XMLNode 的 InnerXML 该节点可以只包含一些文本 带有 HTML 或 XML 例如
  • 如何向 addrange select 语句添加异步“await”?

    我有一个这样的函数 public async Task
  • 在 C# 中通过 C DLL 使用数组和指针

    我对 C 非常陌生 上周才开始学习 我有一个用 C 编写的自定义 DLL 具有以下函数 DLLIMPORT void test function double test 我想要做的是从 C 获取数组 test 的指针 因此 如果在 DLL
  • .net MVC 将 MP4 流式传输到 iDevice 问题

    我一直在编写用于提供视频服务的一段代码 但遇到了一些问题 代码如下 public ResumingFileStreamResult GetMP4Video string videoID if User Identity IsAuthenti
  • 无法从 Web api POST 读取正文数据

    我正在尝试从新的 Asp Net Web Api 中的请求中提取一些数据 我有一个像这样的处理程序设置 public class MyTestHandler DelegatingHandler protected override Syst
  • 如何添加重试以调用 Web 服务?

    我有一个应用程序调用使用 wsHttpBinding 的 Web 服务 我需要在连接超时等情况下对 Web 服务调用实现某种重试功能 执行此操作的最佳方法是什么 我已经阅读过有关 WS ReliableMessaging 的内容 但这不是
  • 日期时间的自定义 JavaScriptConverter?

    我有一个对象 它有一个 DateTime 属性 我想通过 AJAX JSON 将该对象从 ashx 处理程序传递回网页 我不想使用第 3 方控件 当我这样做时 new JavaScriptSerializer Serialize DateT
  • System.IO.Compression 和 ZipFile - 提取并覆盖

    我使用标准 VB NET 库来提取和压缩文件 它也可以工作 但是当我必须提取并且文件已经存在时 问题就出现了 我使用的代码 Imports Imports System IO Compression 崩溃时我调用的方法 ZipFile Ex
  • 使用 System.Security.Cryptography 将 Win32 Crypto API 调用转换为 C#

    我接到一项任务 要删除我们产品的一个 dll 并将其替换为纯 C 的 dll 旧的 DLL 是 NET 2 0 托管 C C CLI 它包装了对 Win32 本机加密 API 的调用 新的 DLL 应公开具有相同名称和方法的新对象 但应使用
  • 新的 .NET 6 控制台模板中的 C# 函数重载不起作用

    我在尝试重载该函数时遇到错误Print object in the 新的 NET 6 C 控制台应用程序模板 https learn microsoft com en us dotnet core tutorials top level t
  • Rfc2898DeriveBytes 与密码的 Sha2 哈希生成

    我最近知道使用 SHA256 为加盐密码生成密码哈希 在阅读了一些有关加盐密码和安全性的内容后 我看到rfc2898derivebytes and passwordderivebytes NET 中的类 使用有什么好处吗rfc2898der
  • Phantom JS 50% 的时间失败

    我搜索一个文本框 然后尝试用字符串填充它 这是代码 var fname driver FindElement By Name iFirstName 50 if fname null do System Threading Thread Sl
  • 在源代码管理中管理我的数据库

    由于我正在处理一个新的数据库项目 在 VS2008 中 而且我从未从头开始开发数据库 因此我立即开始研究如何在源代码管理 在本例中为 Subversion 中管理数据库 我找到了一些关于SO的信息 包括这篇文章 保持多个环境中的开发数据库同
  • LINQ:获取表详细信息

    我正在使用 LINQPad 我想了解表的架构详细信息 我知道我是用 SQL 来做的 SELECT column name FROM information schema columns WHERE table name table name
  • 提供软件设置的最佳方式?

    我正在使用 C NET 在我的软件中 我提供设置对话框 用户可以通过该对话框设置我想要保存到文件的应用程序设置 要求 典型 我定义的每个类都使用这些设置的某些部分 因此 这些对于所有类都应该是全局的 这些应该在软件启动时加载 当用户更改设置
  • 如何使用.net更改selenium中的用户代理

    我想使用不同的代理 iPhone iPad Android 测试用 NET 编写的 Web 应用程序 我使用 NUnit 和 Selenium 进行测试 有人有一个用 c 或 VB 在 Selenium 中更改代理 例如 iPad 或 iP
  • WCF - 如何增加消息大小配额

    我有一个 WCF 服务 它将 1000 条记录从数据库返回给客户端 我有一个 ASP NET WCF 客户端 我在 asp net Web 应用程序项目中添加了服务引用来使用 WCF 当我运行客户端应用程序时 我收到以下消息 传入消息的最大
  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • Moq - 是否可以在不使用 It.IsAny 的情况下设置模拟

    我一直使用 Moq 进行单元测试 有时我会嘲笑有很多参数的方法 想象一下这样的方法 public class WorkClient public void DoSomething string itemName int itemCount
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • WCF 中的 Owin 中间件替代品是什么?

    我正在尝试在 WCF 应用程序中实现多租户 但面临一些问题 所以我已经在应用程序中配置了 Autofac 并且 Autofac 也支持多租户与WCF 现在我的情况略有不同 我有一个正在使用此 WCF 服务的移动应用程序 该服务部署在 Azu
  • Microsoft Office 365 组:来宾用户无法使用图形端点进行驱动器调用[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我们的应用程序通过对驱动器项执行 Get 调用来读取组驱动器内容 这对于内部成员和来宾用户来说过去都工作得很好 它现在适用于内部成员 但不再适用于来宾用户 以下是示例调用 h
  • 网页抓取协助

    我必须从这个网页中提取一些信息 我知道有更简单的方法来获取这些信息 但这就是我的任务 到目前为止 我一直在尝试这样做 import pandas as pd import requests from bs4 import Beautiful
  • 为什么这两个正则表达式的行为不一样?

    我正在尝试使用这样的构造函数语法创建正则表达式new RegExp bword b g 但它的行为并不符合预期 相反 它似乎创建了一个如下所示的正则表达式 bwor b g缺少最后一个字母 我必须使用构造函数语法来创建正则表达式 因为我是从
  • R data.table 如果另一列为 NA,则删除一列重复的行

    这是一个示例 data table dt lt data table col1 c A A B C C D col2 c NA dog cat jeep porsch NA col1 col2 1 A NA 2 A dog 3 B cat
  • Linq To Sql - SQL 默认约束问题

    我在数据库中有一个 USER 表 该表有一个 RegistrationDate 列 该列的默认约束为 GETDATE 使用 LINQ 时 我不为 RegistrationDate 列提供任何数据以将其设置为默认值 但 SQL Server
  • 并非所有代码路径都会返回值,for 循环

    这段代码将比较用户名 and 密码存储在文本文件中 我认为这是因为 for 循环 它可能很简单 但我看不到它 public int loginCheck string users File ReadLines Username Passwo
  • 如何将 Crashlytics 与 iMessage 扩展一起使用?

    我的 iOS 应用程序中有一个 iMessage 扩展 Crashlytics 能否捕获其崩溃情况 我尝试添加相同的Fabric来自我的主应用程序的条目Info plist进入我的 iMessage 扩展程序Info plist 并将以下内
  • Libsvm 中的决策值

    我是 SVM 新手 我使用 Libsvm for Matlab 在预测阶段之后我得到了一个决策值数组 根据 SVM 理论 每个测试记录 z 被指定为正 如果 f z 1 其中 f z 定义为 f z 符号 w z b 那么如何将实例 z 的
  • 在 JBoss 中替换 Websphere 的 WorkManager?

    我们正在从 Websphere 迁移到 JBoss 但某些代码依赖于 Websphere 的 WorkManager com ibm websphere asyncbeans WorkManager 有没有人以前处理过这个问题 并对如何替换
  • 具有两个 Y 轴的图:置信区间

    我试图用误差线和两个 y 轴绘制几个点 然而 在每次调用plotCI 或errbar 函数时 都会初始化一个新的绘图 无论是否有par new TRUE 调用 require plotrix x lt 1 10 y1 lt x rnorm
  • CustomControl DependencyProperty 绑定无法正常工作

    我写了一个自定义控件 它是一个带有按钮的文本框 可打开 OpenFileDialog TextBox 的 Text 属性绑定到我的依赖属性 FileName 如果用户通过 OpenFileDialog 选择文件 我会将结果设置为此属性 Te
  • 使用 sympy 展开索引符号方程

    下面我有一个使用索引符号编写的方程 这个方程可以用图中的六个方程来表示 第一个方程使用索引符号 爱因斯坦符号 https en wikipedia org wiki Einstein notation 在 U k k 中 逗号是导数的约定
  • PyTorch:addmm函数的用途

    以下 PyTorch 函数的目的是什么 doc torch addmm beta 1 mat alpha 1 mat1 mat2 out None 更具体地说 是否有任何理由更喜欢这个函数而不是仅仅使用 beta mat alpha mat
  • 在 ASP.Net 中创建 Repeater 控件

    我正在使用两个下拉菜单并将值绑定到该下拉菜单 现在添加一个新按钮 add new 当我单击 添加 按钮并保留之前选择的值时 我想在下面创建上述下拉列表 请帮助我做到这一点 您可以使用 ASP Net 的 Repeater 控件来达到所需的结
  • 在 django 过滤器中使用关系时过滤器的 OR 定义

    我有三个模型 其简单关系如下 模型 py class Person models Model first name models CharField max length 20 last name models CharField max
  • 从 C 中现有的一维数组创建二维数组?

    在 perl 中 我可以创建一维数组 然后从它们创建二维数组 如下所示 a1 a b c a2 d e f a3 g h i m23 v1 a1 a2 a3 这是另一种方法 假设 a1 a2 and a3与前面的示例相同 m23 v2 a1
  • 使用 AFHTTPRequestOperationManager 时响应失败

    当我尝试使用准确的用户名和密码调用 API AFHTTPRequestOperationManager 进行身份验证方法时 获得准确的响应并且方法成功 然后我尝试使用无效的用户名和密码 但得到的响应是失败 我尝试了 ASIHTTPReque
  • Vulkan 中的 VKAPI_ATTR 和 VKAPI_CALL 宏

    我一直在寻找但我仍然不确定what VKAPI ATTR and VKAPI CALL是 我不确定它们是否应该是一个宏或一些我不知道的奇特的 C 函数声明 What is VKAPI ATTR void VKAPI CALL vkComma
  • 如何以编程方式从 .NET 中注册类型库(设置正确的路径)?

    使用 NET 4 0 我制作了一个支持COM的DLL 我们称之为example dll 并且我已经注册它并使用regasm exe生成了相应的类型库 regasm exe tlb codebase example dll 该类型库称为 ex