【问题标题】:C# implemenation of IDL declaration with an INT_PTRC# 使用 INT_PTR 实现 IDL 声明
【发布时间】:2011-04-26 12:49:02
【问题描述】:

我们在 idl 文件中声明了一个方法,如下所示:

[id(7), helpstring("method SomeFunction")] HRESULT SomeFunction([in] INT_PTR windowHandle, [out, retval] VARIANT_BOOL* dlgResult);

我们用这种方法在 C# 中实现它:

public bool SomeFunction(int windowHandle)

在构建 32 位时效果很好,但是当我们构建 x64 时,类型不匹配,因为 idl 正在寻找 64 位值,而 c# 需要 32 位值。

在 C# 中使用 IntPtr 不起作用,因为代码在 c# 中需要 long 或 int。

我可以在 c# 方法中使用任何可以编译为 long 或 int 的类型,具体取决于平台?

我宁愿不必通过两次使用该函数来复制代码,而且由于向后兼容性,我不确定我们是否可以将 IDL 更改为仅使用 Int64。

任何帮助将不胜感激。 谢谢

【问题讨论】:

    标签: c# 64-bit idl


    【解决方案1】:

    进入项目属性...并进入构建选项卡。

    在那里,您可以找到“条件编译符号”,为您的 x64 平台添加 WIN64。保存。

    对于“AnyCPU”,您可能希望删除该平台...

    然后在代码中使用:

    #if WIN64
         long handle;
         public bool SomeFunction(long windowHandle)
    #else
         int handle;
         public bool SomeFunction(int windowHandle)
    #endif
    

    但是我认为您可以使用 IntPtr 并根据其 Size 属性将其值转换为 int/long...

    【讨论】:

      【解决方案2】:

      您确定IntPtr 不适合您吗? IntPtr 结构有一个构造函数重载,它采用Int32,另一个采用Int64。此外,它还有一个ToInt32() 方法和一个ToInt64() 方法。你的代码会像这样工作:

      public bool SomeFunction(IntPtr windowHandle)
      {
          // Implementation here.
          // If you need the value of the pointer in the implementation,
          // you can use:
          // long actualValue = windowHandle.ToInt64();
      }
      
      long actualHandle = 1234;
      IntPtr handlePtr = new IntPtr(actualHandle);
      bool returnValue = SomeFunction(windowHandle);
      

      【讨论】:

      • 您在底部的代码看起来可以正常工作,但这都是 C# 代码。我遇到的问题是该方法在 IDL 文件中声明,这导致 C# 代码出错:csfile.cs (37): 'csnamespace.csproject.csfile' 没有实现接口成员 'cpplib.Icppinterface.SomeFunction (长)'无论我在 C# 方法中使用和 int 还是 IntPtr,编译 x64 时都会出现该错误。如果我使用 IntPtr,它也不会编译为 32 位,因为签名专门寻找 int。
      • 你说得对,我的解决方案对你不起作用;我读得不够仔细。问题正是您在 IDL 中使用了 INT_PTR,我假设您正在使用这种机制来实现 COM 兼容性。您可以查看 this MSDN reference 从 IDL 角度讨论该问题。是的,它已经 12 岁了,但我认为它仍然与您的情况相关,尤其是专门介绍 INT_PTR 和 LONG_PTR 的部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 2015-02-13
      • 1970-01-01
      • 1970-01-01
      • 2011-11-21
      • 2020-12-03
      • 1970-01-01
      相关资源
      最近更新 更多