问题标签 [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.

0 投票
1 回答
133 浏览

.net - 创建 PIA 时如何避免 TlbImp.exe 错误 TI1021?

几周前,我运行它没有任何错误(只是正常警告):

从那以后,我运行了 Windows Update(以获得几个月的更新)。

但是现在,当我运行相同的命令时:

我得到:

tlbimp 的行为是否可能因更新而改变,或者是否有其他原因我无法再次运行 tlbimp?

上次我肯定没有密钥文件,所以我不确定为什么这次我可能需要一个。

0 投票
1 回答
378 浏览

c++ - 互操作程序集引用了 .NET 框架的哪些功能?

我们有一个包含大约 90 个项目的 Visual Studio 解决方案。它们中的大多数都是针对 DLL 文件构建的,有些是用 C++ 编写的,有些是用 C# 编写的。项目通过 COM 相互通信。我们使用 tlbexp 来生成一些 C# 项目(在 C++ 项目中引用的那些)的 TLB 文件。我们使用 tlbimp 生成 C++ 项目的互操作 DLL。我没有完全深入这个话题,但我认为,互操作文件只是定义了 C++ 类的接口,使它们可以在其他项目中使用,对吗?

现在,问题如下:为了将整个解决方案升级到 Visual Studio 2015 并让它针对 .NET 4.6.1 进行编译,我使用 JetBrains 的 dotPeek 检查了生成的程序集。我可以看到,所有 C# 项目都正确使用 .NET 4.6.1,C++ DLL 本身是本机的,不引用任何 .NET。现在,令我惊讶的是,dotPeek 告诉我,互操作 DLL(由 C++ 项目产生)正在引用 .NET 4.0。

在尝试让他们参考 .NET 4.6.1 和大量研究之后,我终于没有找到任何方法让互操作参考 .NET 4.6.1。这甚至可能吗?我目前的猜测是,所有像这个参考一样生成的互操作 DLL 只是基本的 .NET 4.0,只是因为它使用与 .NET 4.6.1 相同的 CLR。

那正确吗?应该可以在任何安装了 .NET Framework 4.6.1 的系统上执行程序集,不是吗?

0 投票
1 回答
1968 浏览

c++ - 在 idl 中使用 importlib 时,自动生成的 .tlh 中的编译器错误 C3646 'unknown override specifier'

我使用 Visual Studio 2015,我有一个 C# 应用程序项目,它定义了一个 COM 接口并在编译时生成一个 .tlb 文件。现在我想将该 Csharp.tlb 导入 idl。

我的图书馆.idl:

在编译期间出现错误

C3646'csharpObject':MyLibrary.tlh 中的未知覆盖说明符

MyLibrary.tlh 由编译自动生成,如下所示

MyLibrary.tlh:

该错误意味着 ICsharpObjectPtr 或 ICsharpObject 分别是我目前所理解的未知。ICplusplusObjectPtr 是已知的,因为 import "ICplusplus.idl" 将定义添加到 .tlh 和 importlib("ICsharp.tlb"); 没有明显。

出于测试原因,我使用 OLE/COM 对象查看器从 .tlb 生成了 ICsharp.idl,并导入了该 idl。之后错误就消失了。

但是为什么 .tlb 的 importlib 不能直接工作呢?我不想每次都从 .tlb 中生成一个 idl 文件。

我认为缺少#include“ICsharp.tlh”或使该类型以.tlh而闻名。但是如何告诉 idl 或编译器正确引用 ICsharpObject 呢?

非常感谢您的帮助。

0 投票
1 回答
481 浏览

vb.net - CATIA 上的 RegServer 启动(无特权)

我们在网络驱动器上提供了 CATIA R18-R24,每个设计人员都可以在其中启动它。问题是,VB.Net COM 接口不知道启动版本的类型库。要运行 RegServer(为正确版本注册 tlb)需要特权。

有什么方法可以在 CATIA 启动时注册 tlb 吗?或者任何其他解决方案?

0 投票
1 回答
1007 浏览

c# - 从 .tlb 文件创建互操作 dll

我有一个 C++ 项目和一个 ac# 项目。C# 项目通过称为 interop.X.dll 和 interop.XCom.dll 的 2 个互操作 dll 访问 C++ 项目的方法。

当我的 C++ 项目重建时,它会创建 X.tlb 和 XCom.tlb 文件,它还会创建 x_i.c、x_h.h、xCom_i.c、xCom_h.c 文件。我发现文件是由于“配置属性-> MIDL->输出”中的项目设置而创建的,如下图所示;

在此处输入图像描述

我需要知道的是如何使用 .tlb 和其他 c 文件创建 2 个不会自动创建的互操作 dll。我尝试过使用tlbimp x.tlb /out:Interop.x.dll,但创建的 dll 似乎不起作用。

谢谢。

0 投票
1 回答
1427 浏览

dll - 如何从 64 位 dll 生成 64 位互操作?

我在使用工具 TlbImp.exe 生成互操作时遇到问题

输入 dll 是 64 位,但输出 Interop 是 32 位。我无法控制输入 dll,它由第三方提供。

我已经下载了 dumpbin 功能并测试了两个 dll。

A. 命令:

B. 输入 64 位 dll dumpbin:

C. 输出 Interop dll dumpbin:

D. 我试图修改我正在使用的命令,如下所示:

但后来我收到这样的错误:

请让我知道如何克服这个错误?我想从 64 位库中生成 64 位 Interop dll。我相信这是可能的。如果在不更改输入 dll 的情况下有机会做到这一点,请让我知道这一点。然后我需要报告第三方公司。但在我确定我不能超越这一点之前。

我也做了这个问题:Generate 64 bit Interop issue,但我觉得我没有提供足够的信息,或者我会以某种方式部署这个问题,因为我希望它更清楚。如果管理员对此有疑问,请删除另一个并离开。谢谢。

0 投票
1 回答
138 浏览

c# - TlbImp System.TypeLoadException: Int32[49285]' 有太多维度

我有一个 C++ 构建的 tlb,它使用SAFEARRAY; 我曾经tlb importer生成一个 DLL 并使用 C# 构建它,我尝试了不同的选项,例如为/sysarray方法/noclassmembers生成不同的签名:

在这两种情况下,我仍然收到一个错误,抱怨System.TypeLoadException数组定义了太多维度。如何解决此错误?

我的 CMD 输入是"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\tlbimp.exe" /sysarray /out:ADI /noclassmembers /namespace:A.namespace myDTI.tlb

0 投票
0 回答
137 浏览

c# - 在 C++ 中在运行时加载 tlb

我在 C# 中创建了一个 dll,需要由各种 C++ 应用程序使用。在安装我的产品期间,我执行 regasm 命令为我的 dll 生成 .tlb 文件。

如何从我的 C++ 应用程序加载此 tlb 并在其上调用函数?

0 投票
0 回答
217 浏览

c# - tlbimp.exe / COM 互操作生成:VS2017 中的不同结果

过去我一直在使用 VS2015 为 COM 对象生成互操作包装器。COM 对象正在开发中,因此有时接口会发生变化,我必须重新生成互操作包装器。到目前为止没有问题。但是自从我升级到 VS2017 后,我注意到互操作包装器的代码发生了变化。使我的项目无法编译。

具体而言,区别似乎是在 VS2015 中我会获得属性,但在 VS2017 中我会获得一对get_andset_方法。

例如我可以使用类似的东西

string dummy = comObject.AProperty;

如果使用 VS2015 生成的 COM 包装器。但它必须改为

string dummy = comObject.get_AProperty();

相反,当使用 VS2017 生成的 COM 包装器时。

从两个版本中反编译两个包装器,我可以看到它们的定义如下:

VS2015

在 VS2017 中

有什么方法可以让 VS2017 以旧方式生成互操作包装器?

谢谢

0 投票
1 回答
385 浏览

vba - ActiveX 组件无法创建 Sage 数据对象

我正在使用 Sage 提供的一些稍作修改的 VBA 代码连接到 Sage 50 帐户 - 这适用于某些机器,但不适用于其他机器,尽管它们都具有相同版本的 Sage (25.1.128),并且以前曾在所有机器都没有问题。该错误在尝试实例化 Sage 数据对象时特别发生,我得到'Run-time error ' 429': ActiveX component can't create object'

我尝试在其中一台有问题的机器上重新安装 Sage,并检查了是否将正确的引用添加到 VBA 项目中。所有有问题的机器都运行 Windows 10 64 位。这是我正在使用的连接代码:

谷歌搜索问题发现一些结果指向一个名为“SdoENG250.tlb”的 tlb 文件 - 我已经验证该文件位于问题机器上,但我认为它可能需要注册,我不确定如何这样做,甚至检查它是否已注册。我什至不知道这是否是此时问题的根源。