问题标签 [tlbimp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 允许同一个 COM 库的多个版本
我编写了一个 C# 程序和库,允许用户更轻松地使用特定专有模拟器的 COM 接口。
目前,我必须为我希望支持的每个版本的模拟器构建和分发不同版本的 C# 库。开发模拟器的公司会定期发布新版本,每个新版本都会获得一个递增的主版本号。据我所知,版本之间的 COM 接口没有变化(目前),所以从我的角度来看,调用和行为都是相同的。但是,如果我针对模拟器 9.0 版构建库和安装程序,并且用户安装了 10.0 版,我的 C# 程序将找不到模拟器的 COM 接口。(即使是对模拟器的微小升级也会导致 COM 接口的主要版本出现冲突。)所以我必须针对每个受支持的模拟器版本构建我的库。这很烦人,
看来必须有办法做到这一点。我认为此页面可能会描述该方法:How to: Wrap Multiple Versions of Type Libraries。但这似乎对我不起作用。
当然,很可能我只是没有正确地做到这一点。我按照说明获取了两个版本的 COM 接口的 .il 文件。9.0 和 10.0。但是我对下一步感到困惑,找不到示例:
使用文本编辑器,在 Tlbimp.exe 添加的属性下方插入第二个 PrimaryInteropAssemblyAttribute 属性。包括代表第二个类型库版本的主要和次要版本号。
我不确定是否应该复制组装块,或者只是块内的行(我看不到版本信息。)所以我复制了这样的组装块:
这不起作用,但我看不出我的其他解释是如何可能的。谁能看到我做错了什么?我是在完全错误的轨道上,还是我只是组合了 .il 文件的错误部分?
c++ - 致命错误 C1804。无法读取类型库文件
我有一个在头文件中导入两个 .tlbs 的 c++ 项目。
现在derived.tlb
依赖于base.tlb。这些类中的基类base.tlb
是derived.tlb
基于的。
当我编译时,我得到
“致命错误 c1084:无法读取类型库文件 '..\derived.tlb':加载类型库/DLL 时出错。”
现在它在抱怨,derived.tlb
但问题似乎真的在于找不到base.tlb
。
base.tlb
来自一个C# Com interop
项目。如果我在 c# 项目的构建选项卡中检查“注册 com 互操作”,则此问题在 c++ 项目中消失。但我不想注册它。这建立在一个不应该注册任何东西的构建机器上。所以我.tlb
用一个后期构建步骤来创建tlbexport
.
在正确的tlb
文件夹中创建,但似乎没有注册,在导入时#import
找不到。base.tlb
derived.tlb
我在进程监视器中看到,它正在尝试寻找很多地方,base.tlb
但没有找到等同于..\bin\
.
我该怎么做才能让它在正确的地方搜索?在 c++ 项目的“其他包含目录”中为其添加一个条目似乎没有帮助。
c# - Tlbimp 无法生成互操作 Dll
我在 Delphi 中开发了一个 COM 库。当我尝试在 Visual Studio 项目中“添加引用”时,VS 崩溃。我试图通过 tlbimp.exe 构建互操作程序集,但失败了:
TlbImp:错误 TI1000:类型库导入器遇到意外异常:System.AccessViolationException - 试图读取或写入受保护的内存。这通常表明其他内存已损坏。
有趣的是,当我向 Web 应用程序(或网站)项目“添加引用”时,它成功生成了 Interop dll 并添加了引用。
了解 Web 应用程序项目如何使用 tlbimp.exe 对我来说很重要,因为我想自定义互操作生成。
powershell - 如何使用 TLBImp.exe 生成与 PowerShell 兼容的 COM 程序集版本?
我正在使用 PowerShell 中的 MSMQ 触发器和规则做一些工作,但遇到了问题。
我知道以编程方式访问触发器/规则的唯一方法是利用mqtrig.dll程序集,我的研究表明我必须运行tlbimp.exe来创建一个可以从 PowerShell 加载的 .NET 程序集。好的没问题!
除非我运行tlbimp并尝试加载它生成的程序集,否则我收到此错误:
Add-Type : 无法加载文件或程序集 'file:///C:\users\daniel.mann\desktop\mqtrig.dll' 或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。
看着$psversiontable
向我展示了这一点:
所以,好吧。我得到它。我需要使用生成 CLR 2.0 程序集的tlbimp版本。容易,对吧?
好吧,我碰巧在这个盒子上有一些古老版本的 Visual Studio,所以我找到了一个:
C:\Program Files (x86)\Microsoft Visual Studio 8\SDK\v2.0\Bin>tlbimp
Microsoft (R) .NET Framework 类型库到程序集转换器 2.0.50727.42
除了我得到同样的错误。
我已经尝试了至少 3 个不同版本的tlbimp ,它们提供了2.0、3.5和 4.0 的版本。PowerShell 1.0/2.0 的正确版本是什么,它位于开发机器上的什么位置?
我知道你可以创建一个 PowerShell.exe.config 文件并允许它加载更新的程序集,但这绝对不会在这里实现——这是自动化部署方案的一部分,我宁愿不必去将配置文件弄乱作为部署前的步骤。
c# - TlbImp 错误 TI1036 无法导入 SAFEARRAY(float)
我有一个 idl,其中包含一个简单的接口定义:
我向它添加了一个返回 SAFEARRAY(float) 的方法,但是当我运行 TlbImp 为托管代码创建导入库时,我得到:
问题可能出在哪里?
也许我必须参考一些东西?如果是这样……我该怎么办?
问候。
.net - 使用 TLBIMP 生成互操作程序集时存在“动态”返回类型
我有一个 COM 控件,它有一个MyCOMCtl类,该类具有Data属性,可在生成的 COM Interop 程序集中作为get_Data使用。为此 COM 控件生成了两个不同的互操作程序集:
- 通过在 VS2010 中添加 COM 控件,会自动生成一个互操作(和 Ax...)。
- 从 VS2010 命令提示符使用 TBIMP v4 工具。
问题是,当使用 TLBIMP 生成互操作程序集时,get_Data 变为:
但是当它由VS2010自动生成时,它变成:
我的代码需要第二个返回object的代码。VS2010 项目面向.NET Framwork 4 Client Profile,TLBIMP 版本为 4.0.30319.1。
为什么会这样?有没有办法纠正这个问题?
c# - 为什么 C# 需要注册 COM DLL 才能引用它?
要在 C++ 中使用 COM .dll
,我在编译时需要的只是#import
TLB(或提取 TLB 的 DLL),我准备好了。为什么C#需要注册DLL(无注册COM同注册)才能编译?为什么 TLB 不够用?
注意我的问题是关于.dll
使用 COM 对象的编译。我理解为什么必须在运行时注册对象。
c++ - 在 Visual Studio 中导入类型库的正确方法是什么?
背景
我们的构建使用 ant 和自定义任务来构建 Visual Studio 项目/解决方案以及一些 Java 项目。结构基本上是一棵大树,项目中的工件通常向上复制到一个公共构建目录。
这以前完全是一团糟,我已经大大简化了 ant 脚本,现在我已经完成了 Visual Studio 项目/解决方案的大部分工作。这些项目非常古老,并且已通过 Visual Studio 的每个版本升级到 2013 年。我所做的部分更改是使用尽可能多的默认项目属性和宏。其中大多数曾经是硬编码的。
尽管我已修改项目以使用 $(Configuration) 宏将工件与不同的配置分开,但它们仍会被复制到其他解决方案中其他依赖项目的公共位置。因此,为了避免混淆并确保我们的调试版本链接到所有调试库(以前没有发生过),我一直在为目标名称添加后缀。例如,调试 Unicode 构建的目标名称将是 $(ProjectName)DU。
问题
到目前为止这一切都很好,但现在我不确定如何为我们的一个 COM 库完成这些更改。这个库有一个 IDL 文件,MIDL 编译器生成一个 TLB 文件。也许这不是一个好方法,但现在我希望 TLB 文件也有不同的后缀,具体取决于构建。问题是,当我更改 MIDL 配置的类型库属性时,这会破坏 RC 文件中的编译时指令。我认为可以在 TEXTINCLUDE 块中使用 #ifdefs,具体取决于是否设置了 _UNICODE 或 _DEBUG(前提是我通过 Resource Includes 对话框执行此操作,因此我不会破坏 RC 文件)。这也意味着还有其他 importlib 属性也需要 #ifdef 检查。
目前它有点工作而无需重命名 TLB 文件,但这只是因为它们目前仅在此解决方案中使用。
有没有人做过这样的事情或知道更好的解决方案?
更新
我想我在这里真正需要知道的是,在另一个 COM DLL 中使用类型的最佳方法是什么?我什至应该使用 importlib 吗?MSDN 文档说,在大多数情况下,您应该改用导入。我试过这个,但打破了一大堆东西。
c++ - 使用 importlib 属性时出现 MIDL2015 警告
我有一个旧版 Visual Studio 解决方案,其中包含多个项目(已升级到 Visual Studio 2013)。其中一个项目会生成一个 COM DLL。然后通过 importlib 属性将来自该 DLL 的 TLB 导入到另一个项目的 IDL 文件中。当 MIDL 编译器尝试编译依赖项目的 IDL 文件时,它会生成以下警告:
警告 MIDL2015:无法在 importlib 中加载 tlb
当我使用 TLB 文件的完整路径时,它可以工作。
我尝试将路径添加到 MIDL -> Additional Include Directories 属性,但我认为这仅适用于 IDL、标头和 ACF 文件(/I 开关)。
我也尝试过 Linker -> Additional Library Directories 属性,但这也不起作用。
解析 importlib 属性时 MIDL 使用什么搜索路径?
tlbimp - TlbImp 不工作
我有一个供应商提供的 4.0 框架的 dll,我在 3.5 上。供应商告诉我,该 dll 公开了 com 接口,所以我应该仍然可以使用它。我有一个 .dll 和 .tlb 文件。在做了一些研究之后,我尝试使用 TlbImp 但它给了我一个错误。
cmd TlbImp.exe myDll.dll 表示它不是有效的类型库。
cmd TlbImp.exe myDll.tlb 表示库是从 CLR 程序集组装的,不能作为 CLR 程序集重新导入。
关于问题是什么的任何想法,或者我可以用来希望访问 C# 08 中的命令的另一种方法?谢谢!