问题标签 [tlbexp]

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 回答
2341 浏览

.net - 从 .NET 向 COM 公开嵌套数组

我在 .NET (C#) 中有一个方法,它返回string[][]. 使用 RegAsm 或 TlbExp(来自 .NET 2.0 SDK)为包含程序集创建 COM 类型库时,我收到以下警告:

警告:嵌套数组不支持封送处理。

此警告导致相关方法未导出到生成的类型库中。有人告诉我,有一些方法可以使用 Variant 作为 COM 返回类型,然后在 COM 客户端进行强制转换/等。对于这个特定的程序集,目标客户群是 VB6。但是在 .NET 端,您实际上是如何做到这一点的呢?

注意:我有一个现有的旧版 DLL(及其导出的类型库),其中返回类型为 Variant,但此 DLL(和 .tlb)是使用 .NET 之前的旧版工具生成的,因此我无法使用它们。

如果程序集是用 VB.NET 编写的,它会有所帮助吗?

0 投票
1 回答
640 浏览

.net - COM 接口问题 - .NET

最近我正在阅读有关互操作编组的内容,但我仍然不明白一件事。为了使 .NET 程序集对 COM 可见,我需要使用 tlbexp 工具和/或 regasm 工具。为了使 COM 对 .NET 组件可见,我必须使用 tlbimp 工具——这一切对我来说都很清楚。

  1. 除此之外,我在互联网上看到了很多处理具有 guid 属性、IUnknown 和 IDispach 的 COM 接口的代码。

我的问题是所有这些与 COM 有什么关系——我需要使用它吗?我正在准备认证,但他们没有说任何关于接口、指南、IUnknown 等的信息……

我真的不喜欢留下不清楚的东西,所以如果有人可以向我解释一下,我将非常感激。

  1. 我还有一个关于从 COM(tlbimp 工具)导入的类型库的问题。从 COM 导入的类型库是否还需要在系统中注册 COM 对象?

亲切的问候PK

0 投票
2 回答
9478 浏览

.net - 如何在没有 RegAsm.exe 的情况下注册类型库

我想知道是否可以在不使用RegAsm 工具的情况下注册类型库。这是我的情况,希望能解释我为什么要这样做:

我正在.NET 中开发一个程序集,它将为我们较旧的 VB6 应用程序提供一些现代功能。我已经使用 RegAsm 在我的开发机器上成功注册了程序集和类型库,如下所示:

上面的命令生成类型库 (MyAssembly.tlb) 并注册它以及注册程序集。我需要注册类型库,以便我可以在 VB6 中使用 Intellisense。

我对这种方法的问题 是,在生成类型库文件时我没有与TlbExp.exe相同的控制级别。特别是,我需要使用 TlbExp 的 /names 标志来指定我的属性名称的正确大小写(RegAsm 屠宰它们)。所以如果我使用 TlbExp 来生成我的 tlb 文件,有没有什么方法可以将它与程序集注册过程分开注册?

编辑: da_m_n 的回答对于我提出的问题是正确的。但是,我错误地假设,仅仅因为 RegAsm 可以注册一个类型库,就必须注册 tlb 以便在 VB6 中引用它。所以现在我正在注册程序集并使用固定名称引用未注册的 TlbExp 生成的 tlb。

0 投票
1 回答
1046 浏览

c# - tlbexp.exe 更改方法名称的大小写

我有一个相当奇怪的问题。我正在将 C# 库中的接口导出到 COM。我启用了“向 COM 注册”项目设置,因此它调用 tlbexp.exe 来创建类型库。

我们在方法名称上使用驼峰式大小写,我注意到导出的类型库将这些恰好与类名一致的方法更改为 Pascal 大小写...

例如

类型库中导出的 IFoo 定义了 IFoo->RandomClass() 而不是 IFoo->randomClass()

关于是什么原因以及如何阻止它的任何想法?

0 投票
2 回答
11505 浏览

dll - 在 COM dll 上使用 tlbexp.exe

我正在尝试在Centura和 COM .dll 之间建立通信。(从http://download.resip.fr下载用于数据库导入)

Centura 需要一个 .tlb 文件才能与此组件通信。通常我会用它regasm /tlb来生成 .tlb,但因为它是一个 COM .dll,所以这是不可能的。

我发现我可以将 tlbexp 用于 .NET dll: http: //msdn.microsoft.com/en-us/library/hfzzah2c (v=vs.80).aspx

我试过了,知道它可能会失败(因为我有 COM .dll)。我收到了这个错误:

TlbExp:错误 TX0000:无法加载文件或程序集 'file:///C:\Windows\system32\ResipBcb.dll' 或其依赖项之一。该模块应包含程序集清单。

使用 Dependency Walker 我注意到两个 .dll 丢失了。我在网上找到了ieshims.dll,但找不到wer.dll。看到这个问题
不知道tlbexp失败是不是和这个文件丢失有关系?

总而言之,我的问题是:如何从这个 .dll 中获取 .tlb?我似乎找不到任何方法从这个 COM .dll 中提取 .tlb。

最好的问候
克林特坎比尔

0 投票
1 回答
622 浏览

c# - COM 类可见性:C# 到 VB6

我一方面有一个 C# .Net 4.0 应用程序,另一方面有一个 VB6 应用程序。我通过使 Project COM Visible 和 actived register COM Interop 创建了一个 COM 接口。

我通过实现一个导入新 tlb 文件的 C# 应用程序来测试 COM 接口。一切似乎都很好。

作为下一步,我尝试将 dll 与 vb6 一起使用。可以加载 dll,但现在我看不到所有公共类。在 C# 中,我在 vb6 中看到 4 个类,我只能看到 3 个。

我看不到的类是一个“特殊”类,因为它包含一个接口并服务于事件。

班级标有

COMEvents 接口就像

我不得不说一切都很好。比我添加的项目仅影响 COM 接口项目在运行时加载的其他程序集。他们实现了一个改变的接口。那是我对 com 接口所做的唯一更改是向方法添加附加参数。

为什么我再也看不到课程了?为什么只是我改变的课程而不是“冒险”的方式?

需要帮助谢谢!

PS:到目前为止,我尝试过:->所有项目都是构建 x86-> 在 x86 机器上构建项目-> Dependency Walker(缺少 GPSVC.DLL 和 IESHIMS.DLL,但他们以前也这样做过,我认为他们没有 anny效果导致 tlb 已构建并且可以加载)-> 尝试了 tlbexp.exe 但得到一个依赖错误,导致 assambly 运行时比当前运行时更新。wtf?)

0 投票
2 回答
19490 浏览

c# - TlbExp.exe 错误:此程序集由更新的运行时构建

我们正在将部分服务器移至 .net 4.0。作为第一步,我们已经迁移到 Vs2010,但没有更改任何项目的目标框架。

作为第二步,我将服务器的特定部分移动到目标 4.0,以便我们可以使用一些新功能。

在针对 4.0 的类库 DLL 上调用 TLBexp.exe 时遇到问题。此 DLL 还引用了许多针对 2.0 的 DLL。

我收到错误:TlbExp:错误 TX0000:无法加载文件或程序集 'file:Library.dll' 或其依赖项之一。此程序集由比当前加载的运行时更新的运行时构建,无法加载。

我正在调用随附的 TLBExp:Microsoft SDKs\Windows\v7.0A\bin\ 在我在 VS2010 命令提示符中调用的命令中,我引用了 v4.0.30319 二进制文件(例如 mscorlib.tlb)

是否允许在引用 2.0 库的 4.0 DLL 上运行 TLB?如果是,那么我收到此错误的任何原因。

这是我使用的确切命令调用: "C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\tlbexp.exe" /silent /win32 /tlbreference:"C:\Windows\Microsoft.NET\Framework\ v4.0.30319\mscorlib.tlb" /tlbreference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.tlb" /tlbreference:"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ System.Windows.Forms.tlb" /tlbreference:"C:\Windows\system32\stdole2.tlb" C:\Dev\Library.dll

谢谢

0 投票
1 回答
205 浏览

.net - 为什么 System.Runtime.InteropServices.ClassInterfaceType 枚举中没有 AutoUnknown 值?

.NET 中的System.Runtime.InteropServices.ClassInterfaceType枚举有一个AutoDispatch值和一个AutoDual值,但没有AutoUnknown值。为什么不呢,有没有人已经想出了一种相当自动化的方法来完成它,这样我就不必重新发明轮子了?

对于更多背景知识,以下是当前枚举中的三个值以及它们的作用:

  • ClassInterfaceType.None不会为您创建类接口。这是 Microsoft 的推荐值。如果没有类接口,您必须使用您想要的任何成员创建自己的接口,并让您的类实现它。然后,您可以在接口上使用System.Runtime.InteropServices.ClassInterfaceAttribute属性使其成为分派接口(支持后期绑定客户端)、未知接口(支持早期绑定客户端)或双重接口(支持早期绑定客户端和后期绑定客户端)。
  • ClassInterfaceType.AutoDispatch创建一个派生自IDispatch没有显式成员的类接口。由于没有显式成员,它只能支持后期绑定的调用者。
  • ClassInterfaceType.AutoDual创建一个派生自该类接口的类接口,IDispatch该接口确实具有该类的所有公共非静态成员以及其基类和任何已实现接口的所有成员的显式成员。Microsoft 强烈反对使用这个值,“因为版本限制”,因为如果类的任何成员发生变化,类接口也会发生变化。(因此,在类更改后不重新绑定的调用者最终可能会调用错误的方法或传递不正确的参数。)

所以我想知道的是为什么没有一个调用的值ClassInterfaceType.AutoUnknown会创建一个派生自该类接口的类接口,该接口IUnknown明确声明您的类的成员(不是基类或它实现的其他接口)。

虽然我们在这里,但我也希望有ClassInterfaceType.AutoDualDirect类似 AutoDual 的东西,除了它不会公开基类中的所有成员和所有实现的接口,它只会公开类的直接成员,因为其他成员可以通过其他 COM 接口检索。

那么这里的故事是什么,我错过了什么?我知道微软表示,由于“版本控制挑战”,它建议不要使用 AutoDual,并且这些担忧在某种程度上也适用于 AutoUnknown。但尽管有这个建议,他们仍然AutoDual。为什么他们也没有 AutoUnknown?

关于那些“版本控制挑战”的一句话:这些问题中最危险的方面只适用于后期绑定的调用者。AutoUnknown 将生成一个 -IUnknown派生接口,而不是 -IDispatch派生接口,因此我们只需要关注早期绑定客户端可能遇到的版本控制问题。并且由于任何自动生成的类接口的 IID 都会在类的公共非静态成员发生变化时发生变化,因此早期绑定的客户端将无法对现有成员进行“错误调用”,它只会失败 QueryInterface( ) 用于类接口。仍然是失败,但可以管理,而不是崩溃或任何事情。这甚至没有打破不允许接口改变的 COM 规则;它没有改变,它正在成为一个新接口(新 IID)。的确,IUnknownAutoDual 机制的一半(减去派生成员)。事实上,它比 AutoDual 遇到的“版本控制挑战”更少,因为 AutoDual 也有所有后期绑定的挑战。

所以我不得不再次问:如果 AutoUnknown 不存在,为什么 AutoDual 存在!

为了给出一些实际示例,请考虑以下 C# 代码:

生成以下 idl:

很好,但我建议 AutoUnknown 将有助于生成此 idl:

如果现在没有办法自动执行此操作,我将编写一些使用反射来执行此操作的内容,因此我也会很感激有关这方面的任何建议。例如,我需要检查方法上的任何属性吗?关于参数?我深入研究了 ILSystem.Runtime.InteropServices.TypeLibConverter以了解它是如何做到的,但不幸的是,所有好东西都在我无法使用的私有内部调用 nConvertAssemblyToTypeLib() 函数中。

谢谢!

0 投票
1 回答
85 浏览

c# - 当属性的名称与其返回的数据类型相同时,属性会被重命名

我面临以下问题:

我的接口是用 C# 定义的。我在我的界面中使用自定义枚举。一些枚举与它们返回的数据类型具有相同的名称,例如:

我使用 tlbexp 来使用 C++ 中的模块。与其数据类型共享名称的属性从“Name”重命名为“_Name”:

Bar myEnumValue = pFoo->Bar // 不存在

Bar myEnumValue = pFoo->_Bar // 是我的“Bar”-属性

到目前为止,我没有找到任何关于原因以及我是否/如何能够防止这种情况的文档。在构建或导出期间我没有收到任何警告。为了使我的模块的使用直观,我不想重命名属性或枚举。

谁能解释我为什么会这样?

0 投票
1 回答
1001 浏览

c++ - 如何从 .exe 中提取 .tlb

我有一个想要使用的 COM 应用程序,但我只有该应用程序的 .exe。有没有办法从那个.exe中提取.tlb?我尝试使用tlbexp filename.exeVisual Studio 命令提示符,但出现错误,我不知道为什么:TlbExp : error TX0000 : Exception of type 'System.OutOfMemoryException' was thrown. 我正在使用带有 C++ 的 Visual Studio 2012。

编辑:

.exe 是用 C++ 编写的,后来我看到 tlbexp 是用于 .NET 的。这就是它不起作用的原因,很抱歉造成混乱。我仍然需要找到一种从 C++ .exe 中提取 .tlb 的方法。