Kev*_*ier 6 .net vb6 com c++-cli
我编写了一个COM可见的简单.NET项目(类库).它适用于VB6!
代码如下所示:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType::AutoDual)]
public ref class MyObject
{
// Some methods and values
}
Run Code Online (Sandbox Code Playgroud)
程序集已正确签名(如果不在GAC中,则不需要)并注册(regasm MyProject.dll /tlb /codebase).
然后,我的VB6项目中引用了TLB文件,一切正常!我可以访问我的课程和他们内部的公共方法.
在互联网上,许多人说使用ClassInterfaceType::AutoDual不是一个好主意,因为版本控制的潜在问题可能会破坏使用程序集的应用程序.
但是,就我而言,这真的是一个问题吗?此程序集仅用于VB6项目(在早期绑定中).
在每个新版本中,我都会回复这些步骤(签名,注册等).这个解决方案可以解决任何版本问题吗?
无论如何,我可以写一些[GUID("...")]属性吗?
GUID由Visual Studio自动生成,因此每个编译时类都不是相同的GUID.这样对吗?
Han*_*ant 11
如果不使用AutoDual,VB6中的早期绑定将无法工作.此外,自动完成不再适用于VB6编辑器,因此输入错误导致运行时错误的风险更高.VB6程序员倾向于习惯于此,所以可能会坚持它.
当然,它有风险.如果更新COM服务器并且错误地指定了[Guid]而没有更新它,则存在很大的风险,即VB6程序在运行时会因完全不可诊断的错误而崩溃.或者更糟糕的是,根本不会崩溃,而是调用完全错误的方法.
如果你让.NET自动生成[Guid],强烈推荐,那么你不会在运行时遇到硬件崩溃但是"ActiveX组件无法创建对象"错误.哪个更有帮助,肯定不那么危险,但是给你或者用户很少指导在哪里寻找问题.
如果使用ComInterfaceType.InterfaceIsIDispatch,则VB6程序员必须使用后期绑定并使用GetObject()来创建对象.[Guid]不再重要了,如果更改不是太激进,现有VB6代码仍然可以使用COM服务器的概率更高.如果一个方法获得额外的论证,它仍然会轰炸.它会有更好的运行时错误.当然,VB6程序员没有依赖的方法逻辑的改变也没有办法解决问题.缺点是方法调用将大大减慢.