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);
感谢您的回答!
答案 0 :(得分:0)
真正的问题似乎是错误4.它表明不兼容:
OfficeOpenXml.Utils.CompoundDocument.ILockBytes
和
OfficeOpenXml.Utils.ILockBytes
很明显,其中一种类型用于声明CreateILockBytesOnHGlobal
,而另一种类型用于声明调用CreateILockBytesOnHGlobal
时传递的变量。您需要决定使用这两种类型中的哪一种,并坚持使用该单一类型。
您的声明中还有其他错误,如您的其他问题所述。返回值为HRESULT
,映射到int
。它不是布尔值,删除返回值属性。布尔参数也不需要MarshalAs
。默认编组是正确的。