IntPtr 与 COM 中的 As Any
我正在开发一个可以在 C# 和 VBScript 中工作的 COM 对象。它还必须支持 32 和 64 位。
我遇到的问题是指针。请参阅我的 .IDL 的一部分
HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes);
如果我将 PTRTYPE 声明为 void*,则 c# 将它们视为 IntPtr,而 VB6/VBScript 将它们视为“As Any”。
这种方法的问题是我无法使用“Any”类型参数进行更简单的指针数学运算。
如果我将 PTRTYPE 声明为 long(以及 64 位中的“hyper”),现在我可以进行指针数学运算,但在 C# 中,根据 32/64 位平台,我对同一方法有两个不同的定义。
我希望避免使用 VARIANT 作为 PTRTYPE 类型。
有没有办法让它同时兼容 C# 和 VBScript?
提前致谢, 毛罗.
i'm developing a COM object that should work in C# and also in VBScript. Also it must support 32 and 64 bits.
The problem I have is with pointers. See part of my .IDL
HRESULT Copy([in] PTRTYPE destAddr, [in] PTRTYPE srcAddr, [in] int bytes);
If I declare PTRTYPE as void*, c# sees them as an IntPtr and VB6/VBScript sees them "As Any"
The problem with this approach is that I cannot do simpler pointer math with "Any" type parameters.
If I declare PTRTYPE as long (and "hyper" in 64 bits), now I can do pointer math but in C# I have two different definitions for the same method depending 32/64 bit platform.
I wish to avoid using VARIANT as PTRTYPE type.
Is there any way to make it compatible with both C# and VBScript?
Thanks in advance,
Mauro.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我建议不要强迫您类型的消费者进行指针数学运算。
如果将其声明为 void,则始终可以允许偏移量作为参数传递,而不是强制使用者进行操作。这可能看起来更像是 . NET 框架,其中源 + 目标有一个作为简单整数传递的偏移量。
通过这样做,无论您选择哪个使用者,您都可以让该方法正常工作,并为您提供一种在您自己的代码中进行验证(即:确保偏移量合法)的方法,而不是依赖使用者。
I would recommend not forcing the consumer of your type to do the pointer math.
If declare this as void, you can always allow the offsets to be passed as a parameter, instead of forcing the consumer to do the manipulation. This could look a bit more like this Array.Copy overload in the .NET framework, where the source + destination have an offset passed as a simple integer.
By doing this, you allow the method to work correctly no matter what consumer you choose, as well as providing you a means of doing the validation (ie: making sure the offset is legitimate) in your own code instead of relying on the consumer.
我采用的解决方案如下:
1) 将 .idl 复制到另一个文件夹
2) 将您想要成为 IntPtr 的变量中的 __int3264 替换为 void*
3) 从 .idl 文件构建 .tlb 文件
4) 构建主要互操作基于 .tlb 文件。
瞧!
问候,
毛罗.
The solution I adopted was the following:
1) Copy .idl to another folder
2) Replace the __int3264 with void* in the variables you want to be IntPtr
3) Build the .tlb file from the .idl one
4) Build a primary interop based on the .tlb file.
Voilá!
Regards,
Mauro.