- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个与原始代码非常接近的类型库。
我在早期绑定(bind)到其他 VB6 组件时遇到了传递参数数组的问题。在原始的 VB6 中,签名如下所示:
Public Function ExecSPReturnRS(ByVal strProcAs String, _
ParamArray varParams() As Variant) As Recordset
并生成如下所示的 MIDL:
[id(0x60030009), vararg]
HRESULT ExecSPReturnRS([in] BSTR strProc,
[in, out] SAFEARRAY(VARIANT)* varParams,
[out, retval] _Recordset** );
使用 C#,我无法确定生成相同 MIDL 的正确声明。我要么缺少 vararg
声明,要么 varParams 参数声明为 SAFEARRAY(VARIANT)
而不是 SAFEARRAY(VARIANT)*
。
所以如果在 C# 中我声明为:
Recordset ExecSPReturnRS(string storedProc, ref object[] arguments);
...我得到 SAFEARRAY(VARIANT)*
,但没有 vararg
。但是,如果我声明为
Recordset ExecSPReturnRS(string storedProc, params object[] arguments);
...然后我得到 vararg
但 SAFEARRAY 未声明为引用。
我希望 MarshalAsAttribute
可能是可行的方法,但到目前为止我能想到的最好的方法是:
Recordset ExecSPReturnRS(string storedProc,
[MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]
object[] arguments);
但这给了我相同的 MIDL,就像我在没有 MarshalAs 的情况下声明为 params
一样。
本质上,我希望 MIDL 反射(reflect)出我同时指定了 ref
和 params
,这在 C# 下是非法的。我缺少的咒语是什么?
目前,当我在 .NET 中使用 param
声明来代替 VB6 ParamArray 时,针对该对象构建 VB6 组件会导致 函数或接口(interface)标记为受限,或者函数使用了 Visual Basic 中不支持的自动化类型 在 VB 中出错。如果我改用 ref
,则会收到构建错误 Type mismatch: array or user-defined type expected.
在 VB6 中调用我正在查看的特定组件类似于:
Set rs = dbconn.ExecSPReturnRS("dbo.StoredProc", _
Array("@param1", value), _
Array("@param2", value))
我假设问题是类型库问题,因为我的理解是 VB 将在构建时使用它来验证早期绑定(bind)时的调用。但是我后来发现,如果我延迟绑定(bind)所有内容,那么 VB 构建就会成功并且调用似乎可以正常工作。然而,这将需要更改旧版 VB6 的源代码,除了在后期绑定(bind)时失去自动完成功能之外,我预计我也会失去参数的构建时验证。但这可能是我们拥有的最佳选择。
最后一点:目前这是研究/PoC,以找出需要什么,不需要什么。最终,这不是旨在对所有对象进行逐行转换。有些对象需要公开 COM 接口(interface),有些则不需要,还有一些将被重构或删除。但是,在某些地方我们需要维持 COM 兼容接口(interface)以实现向后兼容性,至少在迁移过程中的中短期内是这样。
最佳答案
使用类型库导入程序 (Tlbimp.exe) 生成互操作程序集,然后使用 Redgate Reflector 或类似工具反编译生成的程序集。 Reflector(至少)将生成正确修饰了必要的互操作属性的接口(interface),并且可以将代码复制并粘贴到您自己的源文件中。
关于c# - 编码 ComVisible 组件可变参数数组参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40358296/
使用 [ComVisible()] 和 [ComVisibleAttribute()] 有什么区别?他们做的事情完全一样,有什么区别? 谢谢。 最佳答案 .NET 中的通用约定是所有属性类都以后缀 A
我正在为 Microsoft 认证考试而学习,我遇到了一个情况,其中的类不是 ComVisible,但有方法。我假设因为类对 COM 不可见,所以它的成员将不可访问。但是,显然即使类不是,成员也可以是
我遇到此错误 CA1405“Game1”被标记为 ComVisible(true) 但在其对象层次结构中具有以下 ComVisible(false) 类型:'Game' 在最初是 game1 类的内容
我正在为 Enterprise Architect 编写插件管理器。 加载程序集(插件 dll)时,我需要知道程序集中定义的哪些类型是 COM 可见的,因此我可以添加所需的注册表项以将其注册为 COM
我总是用 [assembly: ComVisible(true)] 将我的 .NET 程序集标记为对 COM 可见。 ,认为我永远不知道何时有人可能需要从 COM 调用他们。我也开始使用 FxCop
我正在考虑将一些用 VB6 编写的遗留 COM 代码迁移到 .NET,但这需要生成一个与原始代码非常接近的类型库。 我在早期绑定(bind)到其他 VB6 组件时遇到了传递参数数组的问题。在原始的 V
我有一个 DLL,它的 ComVisible 属性可能设置为 true,也可能没有。我不确定它是如何构建的,或者具有什么属性?我所知道的是它是一个.Net DLL。简单地说,我怎么知道它是否是 Com
我正在将 C++ 转换为 C++/CLI,并希望将一些托管类公开为 COM 对象。在 C# 中,这很容易,设置 [ComVisible] 并从接口(interface)(也是 ComVisible)继
我们有一个 COM 可见的 .NET exe(.NET 3.5、VS 2010 SP1、VB.NET)项目。 VB6 应用程序使用 CreateObject 从此程序集中创建对象。 如果我们不签署程序
问题 在同一个单线程 COM 客户端中实例化两个独立的 .NET COM 可见类时,.NET 将它们加载到同一个 AppDomain 中。 我猜这是因为它们被加载到同一个线程/进程中。 此行为的示例显
在 C# 类库 (.Net 3.5) 中,我有一个非常简单的类(一些字符串和长属性,没有方法)继承自 System.Web.Services.Protocols.SoapHeader .我的类被标记为
我的情况是,第三方应用程序加载了一组 VB6 Active X DLL 扩展。这些扩展的唯一限制是它们包含一组预定义的 IDispatch 函数。 是否有可能实现一个 COM 可见 .NET DLL,
我创建了一个用给定域名(我工作的公司)签名的 ComVisible DLL。我将这个 DLL 放到客户的 Web 主机上,它在不同的域下运行,并使用以下命令注册它:C:\Windows\Microso
我有 .NET 程序集,其中一些类标记为 ComVisible 此程序集已注册到 regasm/codebase "assembly_path" 我有 app.config 名称(实际上是 - MyA
请帮我回答 Comvisible-enabled 属性是否会减慢 .NET App 的速度? 最佳答案 否 - ComVisibleAttribute 只是一个惰性属性,直到有人查找它,然后根据存储在
当我传递一个 PHP 索引数组时: $myVar = new COM('MyClass'); $myVar->DubbleArray([1, 2]); ...它作为 System.Object[] 传
我继承了我工作的一个大型遗留 ASP.NET 应用程序,我们公司希望我们使用 FxCop 并修复所有主要的规则违规问题。目前似乎普遍存在的规则如下: CA1405: COM visible type
无法从 w/cscript 访问继承属性 (P1)。 类结构看起来像这样: [ComVisible] public interface IA { string P1{get;} } [Com
MSDN 有 this article about [ComVisible] attribute .我不太明白设置 [ComVisible(true)] 时会发生什么。 MSDN 说 The defa
当您在 Visual Studio 中创建新的 C# 项目时,生成的 AssemblyInfo.cs 文件包含一个指定程序集 GUID 的属性。属性上方的注释指出“如果此项目向 COM 公开”则使用它
我是一名优秀的程序员,十分优秀!