- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个包含几个类的托管程序集,这些类有重载方法。我通过
将程序集公开给 COM/IDispatch 调用者[ComVisible(true)]
..并在程序集本身上设置正确的 Guid。我没有为 COM 互操作定义显式接口(interface)。这一切都是动态完成的。我在托管 DLL 上运行 regasm.exe/codebase
并将其注册为 COM 互操作。
当我运行 OleView 时,我可以看到程序集中各个类的 ProgId。但是,浏览那些 ProgIds 并展开 IDispatch 节点,没有这些类的 TypeLib 信息。
即便如此,我仍可以从脚本中调用一个接受零个参数的方法或一个接受一个参数的方法。如果还有一个重载接受多个参数,我就不能按名称调用该方法。我一直得到的错误是
Microsoft VBScript runtime error: Wrong number of arguments or invalid property assignment: <methodname>
由此我了解到 COM/IDispatch 客户端无法正确解析通过 COM 互操作公开的对象上的重载方法。
然后我添加了
[ClassInterface(ClassInterfaceType.AutoDual)]
...到每个有问题的类(class)。在 DLL 上的 regasm.exe
之后,我可以在 IDispatch 节点下看到每个方法的类型库信息。
我发现重载方法会自动获得一个包含附加后缀的名称。 MethodX 会将自动生成的类型库程序集中的重载公开为 MethodX、MethodX_2、MethodX_3 等。
而且我发现通过引用带有这些后缀的方法名称,我可以调用重载方法,尽管不是使用通用名称。
更有趣的是,如果我随后从类中删除了 [ClassInterface(ClassInterfaceType.AutoDual)]
,我仍然可以以这种方式调用重载方法,从而避免参数数量错误或属性分配无效
错误。
我的问题是:这种行为(将数字后缀附加到成员名称)是否稳定?记录在案?可信?
最佳答案
COM 不支持方法重载,因此 .NET COM Interop 层必须即兴发挥。我不确定您所描述的名称修改是否在任何地方都有记录,但即使是,我也不认为使用它是一个好主意——对于 COM 用户来说,它仍然是一个非常不方便的 API。如果您想向 COM 公开您的类,最好的方法是编写一个独特的 COM 友好的 [ComVisible]
接口(interface),并隐藏类本身。以 COM 友好的方式处理重载的正确方法是使用带有一些 [Optional]
参数的单一方法(并委托(delegate)给相应的 .NET 重载)。
关于.net - COM 互操作 (CCW) 中的重载 - IDispatch 名称包含后缀(_2、_3 等),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1277740/
假设我有一个多边形的顶点,它们都是逆时针方向的。我希望沿着这个多边形的边界生成 n 个等距点。有谁知道任何现有的软件包可以做到这一点,如果没有,可以使用一种算法吗?我在 Python 中工作。例如,如
我有一个从 VB6 程序使用的 COM Callable Wrapper,但该程序不会接收 COM 事件,除非注册了 CCW。否则,CCW 工作正常,只是没有事件,直到我删除程序的 list 文件并使
我正在为 C# 类库创建一个 CCW 组件,该库包含一些第三方 DLL。 此用户控件必须在Classic Asp 页面中使用 为此生成了一个 CCW Wrapper 类 在 Wrapper 类中为函数
我正在为 iOS 设备编写一些触摸输入代码,需要确定滑动的移动相对于屏幕中心是顺时针还是逆时针。 使用触摸的 position 和 deltaPosition,我可以使用点积计算从屏幕中心到这些点的向
这就是我的 我在 2D X,Y 中有一个平面 我通过点击屏幕 X', Y' 来设置他的目的地 我计算它需要转向以面向此目的地的角度: // Calculate the angle between pl
我正在研究一种算法,用于将 STL 文件切片为每个切片的单独 SVG 文件。我是我有一组线段的点,这些线段将在每个切片中组成一个或多个多边形(如果 STL 模型中有一个洞,将有几个多边形组成轮廓),我
我有一个 .NET 组件公开为 CCW (Com Callable Wrapper)并加载到非托管 IIS 应用程序(ATL 服务器)中。使用 regasm /codebase 安装程序集并在 COM
我知道CW是顺时针,CCW是逆时针, 但我认为他们达到了同样的效果!他们两个都可以获得一个完整的Rect。path.addRect源码: private void addRect(float left
我找不到任何关于为什么添加到路径的闭合形状想要顺时针或逆时针以及闭合形状意味着什么的解释,比如说要将 CW 或 CCW 添加到路径的椭圆形, 最后你仍然会得到和椭圆形添加到路径? 最佳答案 这些值定义
我有一个包含几个类的托管程序集,这些类有重载方法。我通过 将程序集公开给 COM/IDispatch 调用者 [ComVisible(true)] ..并在程序集本身上设置正确的 Guid。我没有为
我有一个 .NET 服务应用程序的安装项目,它使用一个 .NET 组件,该组件公开一个 COM 接口(interface)(COM 可调用包装器/CCW)。 为了让组件在目标机器上工作,它必须注册到
我是一名优秀的程序员,十分优秀!