【问题标题】:How to embed a typelib .tlb as a resource in a DLL programmatically?如何以编程方式将 typelib .tlb 作为资源嵌入到 DLL 中?
【发布时间】:2019-11-24 09:46:33
【问题描述】:

我正在为软件(即 Autodesk Robot)编写插件。

该软件的维护人员制作了一份描述插件创建的文档,其中解释了以下步骤:

[1.到 6. 是关于配置写作和构建你的项目。]

  1. 然后File menu \ Open \ File -> 打开创建的 dll 文件(在我们的示例中为 ...\MyAddin\bin\Debug\MyAddin.dll)

  2. 将创建的tlb库添加到dll(鼠标右键菜单),资源类型应命名为TYPELIB:

  1. 使用属性(鼠标右键菜单)将 TYPELIB 编号更改为 1
  2. 关闭 Visual Studio 并将更改保存到 dll 文件
  3. 将创建的dll文件复制到您要使用的任何计算机上,在目标文件夹中找到它后,请以这种方式注册: 以管理员身份打开命令提示符窗口 并通过命令注册: c:\Windows\Microsoft.NET\Framework64\v4.0.30319\regasm.exe /tlb /codebase MyAddin.dll

我正在尝试自动化生成和嵌入.tlb 文件的过程。在广泛阅读后,我发现 this questionthe link to this blog post 在已接受答案的 cmets 中。

我在我的项目中添加了一个.rc文件,创建了.tlb文件,将它们两个放在项目的.\bin\Debug文件夹中,将.rc编译为.res,最后指出我刚刚创建的这个资源文件的构建器,正如上面提到的问题的答案所建议的那样。

我的.rc文件内容如下:

1 TYPELIB "RobotOrientAddIn.tlb"

当我构建我的项目时,我没有收到任何错误消息,但如果我打开创建的 dll 文件,文件树中没有“TYPELIB”资源的痕迹......而且我没有知道为什么!

阅读 MS 文档并没有多大帮助,因为我不太熟悉 .NET 行话。

我对此感到非常困惑,如果有人可以提供帮助,我将不胜感激。最终,我想在构建后的事件中完成所有这些,以便在构建项目后无需手动摆弄。

【问题讨论】:

  • 您是否真的要从 .NET 项目构建 .rc 文件? .rc 文件仅适用于 C++ 项目。因此,您可以构建 tlb,但您必须将其添加到 .NET 最终二进制文件中,如帖子步骤 6->8 中所述
  • @SimonMourier 这可以解释原因,谢谢。有没有办法以编程方式做到这一点?我喜欢编程不要两次做同样的事情!
  • “将构建器指向此资源文件”步骤出现问题。这只是没有用,只会让图书馆的用户陷入困境。嵌入类型库对于可以使用 regsvr32.exe 注册的那种 DLL 很有用。所以不是 C# 库。你需要regasm.exe来生成和注册类型库,如图,就够了。理想情况下,它是由安装程序完成的。所有安装程序构建实用程序都可以做到这一点,通常只需点击而不是编程。
  • @HansPassant 谢谢。我不明白为什么该软件需要嵌入式类型库,但如果没有按照文档中的描述嵌入,则无法识别加载项。我将有一个安装程序,但现在我想自动化构建过程。我认为可以通过 GUI 访问的任何内容也可以作为终端命令使用。也许我要求太多了?
  • @SimonMourier 很抱歉坚持,但我发现了这个:docs.microsoft.com/en-us/previous-versions/dotnet/… 似乎rc 文件可以在 VB .net 项目中使用。我理解正确吗?

标签: c# .net com embedded-resource typelib


【解决方案1】:

我也在尝试自动化这个过程,以便于调试机器人插件,我得到了:

  1. 下载 NirCmd 并将其安装到您的 Windows 文件夹中。

  2. 在 Visual Studio 中添加 Post-Build 事件命令:

    "%Windir%\nircmd.exe" elevate "%Windir%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /tlb /codebase $(TargetFileName)
    echo 1 typelib $(TargetName).tlb > $(TargetName).rc
    nircmd.exe wait 5000
    "%ProgramFiles(x86)%\Windows Kits\10\bin\10.0.18362.0\x86\rc.exe" "$(TargetName).rc"
    nircmd.exe wait 5000
    "%ProgramFiles(x86)%\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" "$(SolutionPath)" -property:Win32Resource="$(TargetDir)$(TargetName).res" -property:Configuration=Debug -property:Platform="Any CPU" -property:PostBuildEvent=
    "%Windir%\nircmd.exe" elevate "%Windir%\Microsoft.NET\Framework64\v4.0.30319\RegAsm.exe" /tlb /codebase $(TargetFileName)
    

    第一次创建 tlb 文件。
    第二次创建 rc 文件。
    3rd Waiting 5 秒 unitle 创建的 tlb 文件(如果需要增加)。
    4、将rc文件编译成Win32资源文件(.res)。
    第 5 次(可选)等待 5 秒以确保在最终构建之前完成所有操作。
    使用 res 文件进行第 6 次重建。
    7th 使用嵌入式 tlb 注册最终的 dll 文件。
    .

非常重要:检查 regasm.exe、rc.exe 和 MSBuild.exe 文件的路径并根据需要进行修改。

然后,您只需像往常一样构建您的 dll,它就可以被 Autodesk Robot Add-Ins Manager 接受。

这适用于 VS2019 和 Autodesk Robot 2020。

祝你好运

【讨论】:

  • 有趣,我需要试试。老实说,我放弃了加载项。我现在使用 Python shell 来操作具有自定义高级函数的 Robot。
猜你喜欢
  • 2010-09-29
  • 1970-01-01
  • 2013-10-30
  • 2012-11-25
  • 2017-06-10
  • 1970-01-01
  • 2018-09-21
  • 2015-08-12
  • 2011-10-19
相关资源
最近更新 更多