Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为函数MAPISendMail指定封送处理_C#_Vb.net_Visual Studio 2019_Marshalling_Roslyn Code Analysis - Fatal编程技术网

C# 如何为函数MAPISendMail指定封送处理

C# 如何为函数MAPISendMail指定封送处理,c#,vb.net,visual-studio-2019,marshalling,roslyn-code-analysis,C#,Vb.net,Visual Studio 2019,Marshalling,Roslyn Code Analysis,自从升级到VisualStudio16.8.1以来,我(有些旧)VB.NET项目的代码分析中出现了许多错误 以下DLLImport上有一个错误 <DllImport("MAPI32.DLL")> _ Private Shared Function MAPISendMail ( ByVal sess As IntPtr, _ ByVal hwnd As IntPtr, _

自从升级到VisualStudio16.8.1以来,我(有些旧)VB.NET项目的代码分析中出现了许多错误

以下DLLImport上有一个错误

<DllImport("MAPI32.DLL")> _
Private Shared Function MAPISendMail ( ByVal sess     As IntPtr, _
                                       ByVal hwnd     As IntPtr, _
                                       ByVal message  As MapiMessage, _
                                       ByVal flg      As Integer, _
                                       ByVal rsv      As Integer ) As Integer
End Function
_
专用共享函数MAPISendMail(ByVal sess作为IntPtr_
ByVal hwnd作为IntPtr_
ByVal消息作为MapiMessage_
ByVal flg作为整数_
ByVal rsv(作为整数)作为整数
端函数
错误是

错误CA2101
若要降低安全风险,请将字段“MapiMessage.subject”封送为Unicode,方法是将“MapiMessage”上的StructLayout.CharSet设置为CharSet.Unicode,或将字段显式封送为UnmanagedType.LPWStr。如果需要将此字符串封送为ANSI或系统相关字符串,请显式指定MarshalAs,使用BestFitMapping属性关闭最佳匹配映射,并为增加安全性,打开ThrowOnUnmappableChar

结构MAPI消息定义为

<StructLayout(LayoutKind.Sequential)> _
Public Class MapiMessage
  Public reserved       As Integer
  Public subject        As String
  Public noteText       As String
  Public messageType    As String
  Public dateReceived   As String
  Public conversationID As String
  Public flags          As Integer
  Public originator     As IntPtr
  Public recipCount     As Integer
  Public recips         As IntPtr
  Public fileCount      As Integer
  Public files          As IntPtr
End Class
_
公共类消息
公共保留为整数
作为字符串的公共主题
公共noteText作为字符串
公共消息类型为字符串
公共日期作为字符串接收
作为字符串的公共会话ID
作为整数的公共标志
作为IntPtr的公共发起人
公共计数为整数
作为IntPtr的公共recips
公共文件计数为整数
作为IntPtr的公共文件
末级
我已经尝试在两个函数上指定CharSet.Ansi

<DllImport("MAPI32.DLL", CharSet := CharSet.Ansi)> _
Private Shared Function MAPISendMail ( ByVal sess     As IntPtr, _
                                       ByVal hwnd     As IntPtr, _
                                       ByVal message  As MapiMessage, _
                                       ByVal flg      As Integer, _
                                       ByVal rsv      As Integer ) As Integer
End Function
_
专用共享函数MAPISendMail(ByVal sess作为IntPtr_
ByVal hwnd作为IntPtr_
ByVal消息作为MapiMessage_
ByVal flg作为整数_
ByVal rsv(作为整数)作为整数
端函数
以及结构

<StructLayout(LayoutKind.Sequential, CharSet := CharSet.Ansi)> _
Public Class MapiMessage
  ...
End Class
_
公共类消息
...
末级
并尝试在字段主题上指定Marshallas(UnmanagedType.LPStr)

<MarshalAs(UnmanagedType.LPStr)> _
Public subject        As String
_
作为字符串的公共主题
我还尝试指定BestFitMapping=false和ThrowOnUnmappableChar=true,如错误消息中所示

<DllImport("MAPI32.DLL", CharSet := CharSet.Ansi, BestFitMapping := False, ThrowOnUnmappableChar := True)> _
Private Shared Function MAPISendMail ( ByVal sess     As IntPtr, _
                                       ByVal hwnd     As IntPtr, _
                                       ByVal message  As MapiMessage, _
                                       ByVal flg      As Integer, _
                                       ByVal rsv      As Integer ) As Integer
End Function
_
专用共享函数MAPISendMail(ByVal sess作为IntPtr_
ByVal hwnd作为IntPtr_
ByVal消息作为MapiMessage_
ByVal flg作为整数_
ByVal rsv(作为整数)作为整数
端函数
我仍然得到同样的错误

我还没有尝试使用MAPISendMailW(我还没有找到一个示例),但即使这提供了一个解决方案,也肯定有一种方法可以封送为ANSI而不显示错误消息

<DllImport("MAPI32.DLL", CharSet := CharSet.Ansi, BestFitMapping := False, ThrowOnUnmappableChar := True)> _
Private Shared Function MAPISendMail ( ByVal sess     As IntPtr, _
                                       ByVal hwnd     As IntPtr, _
                                       ByVal message  As MapiMessage, _
                                       ByVal flg      As Integer, _
                                       ByVal rsv      As Integer ) As Integer
End Function

要修复此错误,我必须做些什么?

获得您遇到的代码分析错误的唯一方法是启用已被折旧的“二进制分析器-在构建时运行”选项

以下属性组合消除了“CA2101”错误


专用共享函数MAPISendMail(ByVal sess作为IntPtr,
ByVal hwnd作为IntPtr,
ByVal消息作为MapiMessage,
ByVal flg作为整数,
ByVal rsv(作为整数)作为整数
端函数
公共类消息
公共保留为整数
作为字符串的公共主题
公共noteText作为字符串
公共消息类型为字符串
公共日期作为字符串接收
作为字符串的公共会话ID
作为整数的公共标志
作为IntPtr的公共发起人
公共计数为整数
作为IntPtr的公共recips
公共文件计数为整数
作为IntPtr的公共文件
末级

<代码>参见以下内容:在基本和C++中如何处理字符串有区别。一个基本字符串,长度在对象的开头,而C++字符串中的结尾是“\\ 0”。请参阅以下内容:@jdweng我的代码与该链接中的示例非常对应。我很确定,如果我将链接中的代码剪切并粘贴到一个新项目中,在VB或C#中,我会得到完全相同的错误消息。我的问题不是代码本身,而是错误CA2101。我希望正确地定义属性,这样就不会生成错误。根据我的理解,对于一个C++字符串,用ANSI字符集终止null是正确的。您可能不喜欢这个,但是您应该阅读:谢谢,这是有效的。我错过的是如何将BestFitMapping属性应用于结构定义。我看到二进制分析器已被弃用,我将更新我的项目,但随着Visual Studio 16.8.1的更新,某些内容发生了变化。它似乎忽略了规则集文件(以及.editorconfig文件)中的设置,并将所有内容标记为错误,即使规则集指定它应该是警告。