C#报”NotSupportedException”的原因以及解决办法

  • Post category:C#

当在.NET应用程序中使用不支持的功能时,往往会抛出NotSupportedException。这个异常通常表示当前的操作所需的功能不受当前实现的支持。解决此问题的方式取决于引发异常的原因。

原因:

  1. 编译器输出
    在某些情况下,.NET编译器会自动添加一些代码用于支持特定的C#语言结构。例如,使用迭代器或async方法时,编译器会生成一些状态机相关的代码。如果在运行时.NET Framework或Mono运行时不支持此类构造,则抛出NotSupportedException异常。

  2. .NET框架不支持的功能
    .NET框架不支持某些操作或某些代码可能没有正确的适配。在这种情况下,常常可以使用替代的方案。例如,如果无法使用.NET内置的Zip夹功能,则可以使用SharpZipLib或类似的第三方库进行文件压缩。

解决办法:

如果通过编译器输出确认NotSupportedException异常的原因,请将代码修改为合法的C#语言结构。 例如:

async Task ReadDataAsync() 
{
    using (StreamReader reader = new StreamReader("file.txt")) 
    {
        string data = await reader.ReadToEndAsync();
        Console.WriteLine(data);
    }
}

可以修改为:

Task ReadDataAsync() 
{
    StreamReader reader = new StreamReader("file.txt");
    string data = reader.ReadToEnd();
    Console.WriteLine(data);
    return Task.FromResult(0);
}

如果问题是由于操作不受.NET框架支持,请尝试使用替代方案。例如:

  1. 如果需要对zip文件进行操作,但是无法使用.NET内置的ZipFile功能,则可以使用SharpZipLib进行操作。
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Core;

public void CreateZipFile(string archiveFilename, string password, string folderToAdd) 
{
    ZipFile zf = null;
    try 
    {
        zf = ZipFile.Create(archiveFilename);
        zf.BeginUpdate();
        zf.AddDirectory(folderToAdd);
        zf.CommitUpdate();
    } 
    finally 
    {
        if (zf != null)
            zf.Close();
    }
}
  1. 如果需要访问不存在于.NET框架的操作系统特性,则可以使用Windows API Code Pack或其他本机库来执行操作。