问题标签 [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 投票
2 回答
468 浏览

c# - .Net 到 COM 互操作测试器

我在 C# 中创建了一个向 COM 公开的类。我可以使用 RegAsm.exe 很好地注册它。

我想在发送它之前对其进行测试,但是使用 TlbImp.exe 给我一个错误“类型 libaray 是从 CLR 程序集导出的,并且不能作为 CLR 程序集重新导入。”

什么是测试这个的好方法?

0 投票
1 回答
732 浏览

.net - 如何使 .NET 不使用已注册的 TLB 来编组对 COM 方法的调用?

目前的配置是:

  1. 主应用程序是非托管的。
  2. 它包含DLL,包含TLB,描述函数,暴露给COM模型。
  3. 为了支持 ASMX Web 服务,它加载 .NET 框架,并启动为 Web 服务调用提供服务的 ASP.NET 域。
  4. 为了提供 Web 服务调用,它需要来自主应用程序的数据。因此,我们从 TLB 生成 Interop 程序集(使用 tlbimp.exe),Web 服务程序集使用此 Interop 与主应用程序中的 COM 对象进行通信。

一切正常,直到我们遇到版本问题。当同一台计算机上安装了 2 个版本的应用程序(包含 2 个版本的 TLB)时,两个版本的 TLB(例如,2.0 和 2.1)都已注册,并且较低版本停止工作。ProcessMonitor 显示,当尝试调用 2.0 版实例的 Web 服务时,它会在注册表中查找 TLB 的 GUID,读取所有带有版本号的子键,获取最后一个版本 (2.1) 并开始读取其内容。之后,它读取 2.1 版的 DLL,并且无法在自己的进程内进行 COM 调用 - 据我所知,由于编组问题。

如何制作不需要存在 TLB(至少存在已注册 TLB)的互操作来进行进程内 COM 调用?

提前致谢。

0 投票
1 回答
5912 浏览

com - 如何在命令行上从 COM exe 中提取 TypeLib

我最近需要生成一个互操作程序集。经过一番谷歌搜索后,我发现tlbimp.exe. 我的下一个问题是我的 COM 库没有附带.tlb文件。进一步的谷歌搜索显示类型库通常作为资源包含在 exe/dll 中。果然,在 VS2010 中打开 exe 显示它是 lib 类型,然后右键单击我有一个 tlb 文件可以与tlbimp. 惊人的。

然而,这不是一个很好的过程。我将来是否需要这样做,有没有办法使用命令行从 .exe 中提取类型库(.tlb 文件)?

0 投票
1 回答
259 浏览

windows - tlbimp 生成的 COM Wrapper 是否依赖于操作系统版本

我们正在使用 tlbimp.exe 为 wuapi.dll 生成 Interop dll。tlbimp.exe 生成的这个互操作 dll 是否依赖于操作系统版本?

如果必须打包并安装在客户端计算机上,是否需要打包 wuapi.dll 的依赖项?

有关更多上下文:

C# 代码查找已安装的所有 Office 更新

如何获取已安装更新和修补程序的列表?

0 投票
2 回答
612 浏览

.net - 了解 .NET + COM 互操作性

在从 .NET 应用程序调用使用 TLBIMP.EXE 创建的 COM/DLL 时,我需要了解架构方面的帮助。场景是:

我有一个名为 XYZ.DLL 的 DLL,其中包含方法、类等。我现在可以围绕 XYZ.DLL 创建一个 .NET 包装器,并将获得一个可以从我的 .NET 应用程序引用的 Interop.XYZ.DLL。

我的第一个问题是:当我在 .NET 应用程序中从 Interop.XYZ.DLL 中的类创建对象并调用该类的方法时,是否调用了原始 XYZ.DLL?据我了解,Interop.XYZ.DLL 现在可以作为原始 XYZ.DLL 的代理类的一种形式,因此 XYZ.DLL 必须始终存在于系统上才能进行调用?

第二个问题:假设我使用 TLBIMP.EXE 创建了 interop.XYZ.DLL。在我的 .NET 应用程序运行的系统上,XYZ.DLL 文件被修补/更新。我的假设是,只要在新修补的 XYZ.DLL 中提供相同的类/方法,我的应用程序仍然可以工作。还是我错了?在必须处理引用的互操作 DLL 的修补时,是否有任何最佳实践?

谢谢 !

最好的问候弗兰克

0 投票
1 回答
2761 浏览

.net - DCOM 服务器和客户端都用 .NET 编写

我正在.NET 4(VS2010,C#)中开发一个 DCOM 服务器。就其本身而言,这工作正常。

现在,我还需要为这个 DCOM 服务器开发一个 .NET 客户端,但我无法添加对 TypeLib 的引用。Visual Studio 会告诉我类型库是从 .NET 程序集中导出的,不能作为参考添加。

这个问题的答案表明我应该能够用来TlbImp.exe生成包装程序集,但它也会拒绝这样做:

TlbImp:错误 TI1029:类型库“MyWrapper”是从 CLR 程序集导出的,不能作为 CLR 程序集重新导入。

我知道从纯粹的 .NET 角度来看,为此使用 DCOM 可能没有多大意义。但是,非 .NET 应用程序也应该可以访问同一服务器。

我尝试将我的 tlb 转换为 IDL 并从中重新生成 tlb,但这并不能欺骗 Visual Studio。

也许可以在重新生成之前稍微修改 IDL,或者有什么方法可以强制使用 DCOM,即使服务器和客户端都是用 .NET 编写的?

0 投票
2 回答
970 浏览

.net - tlbimp 如何用于指定不同的文件和程序集版本?

我们正在使用 tlbimp 生成互操作程序集。我们想用文件版本和程序集版本标记互操作程序集。但是, tlbimp 上的 /asmversion 选项似乎将这两个设置为相同的值。

有谁知道如何使用 tlbimp 在互操作程序集上设置不同的文件和程序集版本?

0 投票
2 回答
927 浏览

c# - .NET 互操作层和 COM 之间会发生什么?

我在我的 C# .NET 项目中使用 COM。
但是,我调用的其中一种方法没有按预期运行。
所以我很想知道我的 .NET 代码、互操作层和 COM 之间发生了什么。
我知道tlbimp.exe为 COM 组件生成元数据包装器,我可以在对象浏览器中看到这些生成的方法。
当调用这些包装器方法之一时,我是否能够查看/调试会发生什么?

我将一个数组传递给下面的方法,并期望这个数组会被填充,但是数组不会被填充。我正在调用以下tlbimp.exe生成的方法,结果出乎意料:

方法 IDL:

.NET 代码调用此方法:

我称之为的其他 COM 方法工作正常。但是,当我调用任何需要 Array 作为参数的方法时,它不会按预期工作。
我假设 COM 互操作编组器有一些有趣的地方。
所以我想知道我打电话后是否能看到发生了什么GetTags()方法后是否可以看到发生了什么。

我也在这里阅读了以下内容。

"if you are not satisified with the COM Interop marshaller, you can "override" just about every aspect of it through the very large and useful System::Runtime::InteropServices namespace"

我怎样才能实现上述目标?

编辑:添加一个有效的 Delphi 测试脚本

0 投票
2 回答
1579 浏览

com - 托管 C++ 中的 shdocvw

我正在尝试在托管 C++ 程序中使用 shdocvw。我已经阅读了使用托管 C++ - CodeProject 的 COM 互操作。我使用了如何添加对托管 Visual C++ 项目的引用中的说明来创建 Interop.shdocvw.dll。我将文件移动到我的项目目录。我正在使用 VS 2010 专业版。我补充说:

到我的程序。在我的程序中,我有:

我收到错误消息:

错误 C2653:“SHDocVw”:不是类或命名空间名称

我也尝试过使用“使用命名空间”,但这也不起作用。

我没有从#using 中得到错误,所以它正在查找文件。我想我已经接近让它工作了;我错过了什么?

0 投票
3 回答
2665 浏览

c# - 如何为 COM 互操作库而不是程序集生成 C# 源代码?

导入 COM 库(直接使用 tlbimp,或间接使用 Visual Studio 添加引用对话框)时,是否有办法生成 C# 源代码而不是二进制互操作程序集,例如 Interop.Word.dll?

UPD:反射器是个坏主意。问题是对于com 接口来说不仅仅是一个签名,而是成员的顺序。反射器这个命令被违反了