Can not marshal parameter #1: Invalid managed/unmanaged type combination (this value type must be paired with Struct). 是什么意
我在程序中用到了unrar.dll(可以到WinRAR的官方网站下载)来对RAR格式的文件解压,结构是如下定义的:
<StructLayout(LayoutKind.Explicit)> Public Structure RARHeaderData
<FieldOffset(0), MarshalAs(UnmanagedType.AnsiBStr)> Public ArcName() As Char
<FieldOffset(260), MarshalAs(UnmanagedType.AnsiBStr)> Public FileName() As Char
<FieldOffset(520)> Public Flags As Integer
<FieldOffset(524)> Public PackSize As Integer
<FieldOffset(528)> Public UnpSize As Integer
<FieldOffset(532)> Public HostOS As Integer
<FieldOffset(536)> Public FileCRC As Integer
<FieldOffset(540)> Public FileTime As Integer
<FieldOffset(544)> Public UnpVer As Integer
<FieldOffset(548)> Public Method As Integer
<FieldOffset(552)> Public FileAttr As Integer
<FieldOffset(556), MarshalAs(UnmanagedType.LPStr)> Public CmtBuf As String
<FieldOffset(560)> Public CmtBufSize As Integer
<FieldOffset(564)> Public CmtSize As Integer
<FieldOffset(568)> Public CmtState As Integer
Sub New(ByVal Reserved As Integer)
ReDim ArcName(260)
ReDim FileName(260)
End Sub
End Structure
<StructLayout(LayoutKind.Sequential)> Public Structure RAROpenArchiveData
<MarshalAs(UnmanagedType.LPStr)> Public ArcName As String
Public OpenMode As Integer
Public OpenResult As Integer
<MarshalAs(UnmanagedType.LPStr)> Public CmtBuf As String
Public CmtBufSize As Integer
Public CmtSize As Integer
Public CmtState As Integer
End Structure
因为总是出错,所以修改了很多遍,于是就成了这个样子,API声明:
Public Declare Auto Function RAROpenArchive Lib "unrar.dll" (<MarshalAs(UnmanagedType.LPStruct)> ByRef ArchiveData As RAROpenArchiveData) As Integer
Public Declare Auto Function RARCloseArchive Lib "unrar.dll" (ByVal hArcData As Integer) As Integer
Public Declare Auto Function RARReadHeader Lib "unrar.dll" (ByVal hArcData As Integer, <MarshalAs(UnmanagedType.LPStruct)> ByRef HeaderData As RARHeaderData) As Integer
Public Declare Auto Function RARProcessFile Lib "unrar.dll" (ByVal hArcData As Integer, ByVal Operation As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal DestPath As String, <MarshalAs(UnmanagedType.LPStr)> ByVal DestName As String) As Integer
Public Declare Auto Sub RARSetChangeVolProc Lib "unrar.dll" (ByVal hArcData As Integer, ByVal Mode As Integer)
Public Declare Auto Sub RARSetPassword Lib "unrar.dll" (ByVal hArcData As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal Password As String)
一旦编译执行的时候就会在DLL中跑出异常:
未处理的“System.Runtime.InteropServices.MarshalDirectiveException”类型异常出现在 Setup.exe 中
其它信息:Can not marshal parameter #1: Invalid managed/unmanaged type combination (this value type must be paired with Struct).
怎么解决?