MSOCAF验证 - 将P / Invokes移动到NativeMethods类

时间:2014-11-18 13:30:31

标签: c# pinvoke code-analysis

Hello guy我在MSOCAF中遇到此错误:

  

因为它是P / Invoke方法,   'CompoundDocument.CreateILockBytesOnHGlobal(IntPtr,bool,out   CompoundDocument.ILockBytes)'应该在一个名为的类中定义   NativeMethods,SafeNativeMethods或UnsafeNativeMethods

我创建了一个新类NativeMethods并在此类中移动我的P / Invoke。但是当我试图调用我的P / Invoke时,我有一个错误:

错误3

  

最佳重载方法匹配   “OfficeOpenXml.Utils.NativeMethods.CreateILockBytesOnHGlobal(System.IntPtr,   bool,out OfficeOpenXml.Utils.ILockBytes)'有一些无效   参数D:\ TFS \ L0449745 \ MSOCAF PUR-Contracts \ Source   code \ PUR-Contracts \ Total.SharePoint.PUR-Contracts.ImportJob \ Total.SharePoint.PUR-Contracts.ImportJob \ Excel \ Utils \ CompoundDocument.cs 60 24 Total.SharePoint.PUR-Contracts.ImportJob

错误4

  

参数3:无法从'转出'   OfficeOpenXml.Utils.CompoundDocument.ILockBytes'to'out   OfficeOpenXml.Utils.ILockBytes'D:\ TFS \ L0449745 \ MSOCAF   PUR-合同\源   code \ PUR-Contracts \ Total.SharePoint.PUR-Contracts.ImportJob \ Total.SharePoint.PUR-Contracts.ImportJob \ Excel \ Utils \ CompoundDocument.cs 60 87 Total.SharePoint.PUR-Contracts.ImportJob

这是NativeMethods类:

internal static class NativeMethods
{
    [DllImport("ole32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern int CreateILockBytesOnHGlobal(
        IntPtr hGlobal,
    [MarshalAs(UnmanagedType.U1)] bool fDeleteOnRelease,

        out ILockBytes ppLkbyt);
}

我调用P / Invoke时的代码:

 ILockBytes lb;
        var iret = NativeMethods.CreateILockBytesOnHGlobal(IntPtr.Zero, true, out lb);

        IntPtr buffer = Marshal.AllocHGlobal(doc.Length);
        Marshal.Copy(doc, 0, buffer, doc.Length);
        UIntPtr readSize;
        lb.WriteAt(0, buffer, doc.Length, out readSize);
        Marshal.FreeHGlobal(buffer);

感谢您的回答!

1 个答案:

答案 0 :(得分:0)

真正的问题似乎是错误4.它表明不兼容:

OfficeOpenXml.Utils.CompoundDocument.ILockBytes

OfficeOpenXml.Utils.ILockBytes

很明显,其中一种类型用于声明CreateILockBytesOnHGlobal,而另一种类型用于声明调用CreateILockBytesOnHGlobal时传递的变量。您需要决定使用这两种类型中的哪一种,并坚持使用该单一类型。

您的声明中还有其他错误,如您的其他问题所述。返回值为HRESULT,映射到int。它不是布尔值,删除返回值属性。布尔参数也不需要MarshalAs。默认编组是正确的。