2

我实际上对同一个问题有两个问题,但我认为最好将它们分开,因为我认为它们不相关。

背景:我正在用 VB.NET 编写一个 Windows Mobile 软件,其中的任务需要连接到邮件服务器以发送和检索电子邮件。因此,我还需要一个 Mime 解析器(用于解码和编码)电子邮件以获取附件。首先我想,我会写一个小“hack”来处理这个问题(使用普通的字符串解析),但后来我在 CodeProject看到了一个用 C# 编写的项目我认为我会在我的解决方案中实施。我对 C# 了解不多,所以我只是从这些类中创建了一个类库,并在我的 VB.NET 项目中使用它。当我在普通 Windows 计算机上针对 Net Framework 时,这个库工作得非常好,但是当我要针对 Compact Net Framework 制作相同的库时,我遇到了麻烦。这是很自然的,因为 Compact Net Framework 有更多的限制,但我实际上并没有得到那么多错误——尽管在代码的不同地方重复了,但只有两个错误。

其中一个错误是在这个问题的主题中引用的,即“方法'GetString'没有重载需要'1'参数”。如上所述,我对 C# 了解不多,所以我将在线错误的类转换为 VB-NET,但我仍然不太了解。这是给出上述错误的函数:

public virtual string DecodeToString(string s)
{
  byte[] b = DecodeToBytes(s);
  if(m_charset != null)
  {
    //ERROR ON THIS LINE
    return System.Text.Encoding.GetEncoding(m_charset).GetString(b);
  }
  else
  {
    m_charset = System.Text.Encoding.Default.BodyName;
    //ERROR ON THIS LINE
    return System.Text.Encoding.Default.GetString(b);
  }
}

如果这个类需要完整的源代码,那么我可以在这个线程的另一条消息中发布它,或者你可以通过在上面提到的网站上下载代码并查看名为 MimeCode 的类来找到它。 CS。

谁能帮帮我?我可以以某种方式重写上面的函数来克服这个问题吗?

我提前感谢您的帮助。

向你们所有人致以诚挚的问候和新年快乐。

Rgds, moster67

4

4 回答 4

9

CF .NET 要求您使用签名:Encoding.GetString Method (array[], Int32 index, Int32 count) 所以尝试使用:

...GetString(b, 0, b.Length);
于 2008-12-31T10:13:08.657 回答
2

如果您在 MSDN 上查找 Encoding 类,您将找到有关紧凑框架中方法可用性的信息。

http://msdn.microsoft.com/en-us/library/system.text.encoding.default.aspx

在您的情况下,.NET Compact Framework 3.5、2.0、1.0 支持 System.Text.Encoding.Default 属性,因此您应该做好准备。

但事情就是这样。MS 有时会从类实现中删除一些方法,或者准确地说是重载。

查看文档 http://msdn.microsoft.com/en-us/library/system.text.encoding.getstring.aspx您可以通过查看图标(左侧的小图像)来判断,而 .NET Compact框架支持编码类,一些重载被删除。

当您将 byte[] 数组传递给 GetString 方法时,它找不到该重载,因此您必须添加一个 int 偏移量和 int 计数。

于 2008-12-31T10:18:29.580 回答
1

紧凑的框架可能不支持只需要一个字节数组的重载。尝试使用字节数组、起始索引和计数的重载,并将其设为 0 作为起始索引,并将 b.Length 作为长度。

于 2008-12-31T10:14:45.550 回答
0

感谢 Michael、John 和 Rune 回答我的问题。通过使用您的建议,我解决了问题并设法编译/构建了针对 CF.NET 3.5 的库。还要感谢 ctacke 编辑我的问题并使其更具可读性。

顺便说一句,正如我在第一篇文章中提到的那样,我遇到了另一个问题,我打算在另一个线程中询问,并且不允许我为 CF.NET 构建库,即以下行:

m_charset = System.Text.Encoding.Default.BodyName;

在这种情况下,问题在于 CF.NET 无法识别“BodyName”。我找不到任何替代方法或解决方法来获取使用的字符集(BodyName 检索此信息),所以最后我只是为其分配了一个固定值(iso-8859-1)。这意味着不幸的是,该库不会处理所有不同的字符集,但至少代码不会中断并且我能够编译它。无论如何,对我来说这就足够了,因为我的应用程序不关心文本消息——它使用电子邮件来发送和获取附件(类似于 Gmail 驱动器,但使用我自己的提供商)。

再一次感谢你。

亲切的问候, moster67

于 2008-12-31T15:28:43.823 回答