C#和.NET Framework 3.5中的后期绑定

3

我正在尝试将这段代码转换为C# .NET Framework 3.5,但该版本不太友好于后期绑定。如果我使用4.0,我会使用动态类型,但现在这不是一个选项。

让事情变得复杂的是,我真正想创建的对象(atl3270Tool)是在参数内创建的。希望能得到帮助。

Dim atl3270Tool
Dim ErrMsg As String
Dim S_OK As UInt16 = 0
Dim atlDirectorObject = CreateObject("atlDirectorObject.atlDirector")
If atlDirectorObject.CreateTool("3270", 1, True, True, 0, atl3270Tool, ErrMsg) <> S_OK Then
    'Terminate
End If

看起来你正在尝试将VB代码转换为.NET 3.5中的C#。你遇到的问题是让atDirectoryObject在C#中正常工作。我建议你查看这些主题1 - http://msdn.microsoft.com/en-us/library/e7a79b4y(v=vs.100).aspx 2 - http://msdn.microsoft.com/en-US/library/ms173184(v=vs.100).aspx - Ray Cheng
只是一个快速的提醒,C#或VB中没有动态类型。它们都是静态语言。我永远不会理解为什么C#要用他们的“dynamic”关键字来混淆一大堆人。它应该被称为“latebound”。 - Drunken Code Monkey
1个回答

5
晚期绑定在vb.net中很容易实现。因此,利用.NET支持使用不同语言编写代码的功能,添加一个vb.net类库项目来封装COM组件。
标识符名称上的"atl"前缀很奇怪。ATL是ActiveX模板库的缩写,是一种非常流行的用于编写COM组件的C++库。默认情况下,它创建支持双向绑定(晚期和早期)的服务器。对于早期绑定,您需要一个类型库,它会被默认嵌入到ATL项目中的可执行文件中。因此,请确保您不要浪费在此处编写早期绑定的C#代码的机会。项目+添加引用,浏览选项卡,选择DLL。如果没有投诉,则可以使用对象浏览器查看生成的互操作库。

注意--有时候,你不能轻易地使用早期绑定在C#中构建COM对象的实例。你将不得不使用Activator类来动态创建对象的实例。如果发生这种情况,请使用Activator.CreateInstance(typeName) - GregRos
这被称为后期绑定 :) - Hans Passant
这只是一个非常有限的晚期绑定示例。但在这种情况下,它的唯一目的是因为有时COM对象的构造函数对.NET隐藏。与NET 4.0中的动态关键字不同,他仍然无法舒适地调用以这种方式实例化的对象上的方法。 - GregRos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接