我正在编写Visual Studio加载项,需要将托管的CodeElements对象编码为它的无规则形式。我只需要内存中的指针,因为我可以将其强制转换并在非托管方面将其视为CodeElement。

    [DllImport("CodeMethodsToString.dll")]
    private static extern BSTR* CodeMethodsToString(void* functionObject);

    public static void CodeMethodsToXML(XmlElement parent, CodeElements elements)
    {
        //Call CodeMethodsToString: how do I marshall CodeElements to an IntPtr?
        //set XmlElement in here
    }

我知道如何处理XML,并且在C#中有一个有效的版本。我创建非托管DLL是因为在最低的递归级别上调用所有各种成员变量会破坏程序的速度。我只需要知道如何使用System.Runtime.Interop.Marshal将CodeElements对象转换为指向内存中COM对象的指针。

谢谢。

最佳答案

乔纳森看起来很近。这是我的方法:

[DllImport("CodeMethodsToString.dll")]
[return: MarshalAs(UnmanagedType.BStr)]
private static extern string CodeMethodsToString(IntPtr functionObject);

public static void CodeMethodsToXML(XmlElement parent, CodeElements elements)
{
   GCHandle pin;
   try
   {
      pin = GcHandle.Alloc(elements, GCHandleType.Pinned);
      string methods = CodeMethodsToString(pin.AddrOfPinnedObject());
    }
    finally
    {
       pin.Free();
    }
}

关于c# - 在C#中将CodeElements编码到IntPtr,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1302237/

10-13 03:36