我是一个c++开发者,现在一个项目需要用c sharp,刚开始学习c sharp。问题如下,
public delegate uint EdsPropertyEventHandler(uint inEvent, uint inPropertyID, uint inParam, IntPtr inContext); 在上面这个委托中,最后一个参数是IntPtr,但是我现在希望能够像c++那样能够传递this给IntPtr,然后在这个委托函数中调用this的函数。1、这样是否可行?2、我觉得我对IntPtr理解不清楚的,那位可以解释哈?3、如果这种方法不行,我可以通过什么方式来实现我要功能(注意那个委托是一个lib中的函数,我没法去修改)。

解决方案 »

  1.   

    C#中的IntPtr类型称为“平台特定的整数类型”,它们用于本机资源,如窗口句柄。
     (IntPtr)this.Handle
      

  2.   

    1. 可以
    2. IntPtr 就是一个 pointer
      

  3.   

    但是编译说没法将this转换为IntPtr。
      

  4.   


    强制转
    不过成功率应该不高, C++ 的 class 和 C# 的class 是不同的
      

  5.   

    在C#程序集文件中添加[assembly: CLSCompliant(true)]
    在C#类上添加[CLSCompliant(true)]
    上面的方法有点诡异,不习惯的话就在C#下用非安全(unsafe)代码好了,非安全代码中可以使用指针
      

  6.   

    我的都是c sharp代码,也是c sharp的类
      

  7.   

    传这个值  (IntPtr)this.Handle
      

  8.   

    这个类是我自己写的。没有Handle的,也不需要Handle句柄
      

  9.   

    楼上的大哥。this这个类是我自己写的,没有Handle这个属性啊
      

  10.   

    不能直接把 this 赋给 IntPtr类型(根本不能保证他们的继承层次关系)     C#中IntPtr一般用于本机资源,如窗口句柄等但是我现在希望能够像c++那样能够传递this给IntPtr,然后在这个委托函数中调用this的函数。
    ----------------------
    既然Lib里面写的参数类型是IntPtr,那么Lib的作者初衷肯定不是让你传递this,而是本机资源,如某个窗体的句柄
      

  11.   

    是这个相机的一个事件函数的,在c++版,她自己的代码就传的this指针。但是他c#版没有实例代码。这个是canon的 EDSDK
      

  12.   

    以下仅供参考.net中的大部分委托签名如下 void OnDoSome( object sender, EventArgs e);
    而sender一般为调用方。也就是LZ所谓的thisLZ的是要做什么,是在C#中使用非托管的lib吗?
    但是不明白为什么要传this过去,而this里面的东西是未知的(调用方与实现方互相不知道里面有什么东西)。
      

  13.   

    我看难办。IntPtr可以简单的理解为一个C++的指针,指向一个空间。但是,如果你传了个对象过去,这样对象中还有其它对象的引用(表现为对象属性),这样地址(空间)就不连续了,可能会有些麻烦。
      

  14.   

    最好是把lib中的C++接口(契约)给出来,这样可能帮助会更大此。
      

  15.   

    问题解决,在这里把方法也告知下:具体是用GCHandle(Provides a way to access a managed object from unmanaged memory.)public class App
    {
       public static void Main()
       {
          TextWriter tw = System.Console.Out;
          GCHandle gch = GCHandle.Alloc( tw );
          CallBack cewp = new CallBack( CaptureEnumWindowsProc );
          
          // Platform invoke prevents the delegate from being garbage 
          // collected before the call ends.
          LibWrap.EnumWindows( cewp, (IntPtr)gch );
          gch.Free();
       }
       
       private static bool CaptureEnumWindowsProc( int handle, IntPtr param )
       {
          GCHandle gch = (GCHandle)param;
          TextWriter tw = (TextWriter)gch.Target;
          tw.WriteLine( handle );
          return true;
       }   
    }在这里把一个TextWriter类转换为IntPtr