繁体   English   中英

System.TypeLoadException Microsoft.VisualBasic ASP.NET Core 2

[英]System.TypeLoadException Microsoft.VisualBasic ASP.NET Core 2

Microsoft.VisualBasic 程序集是否与 ASP.NET Core2 不兼容?

我有一个 C# 类库,它提供了一种读取 CSV 文件的方法,我选择使用 Microsoft.VisualBasic.FileIO.TextFieldParser 来读取文件。 在 WPF 应用程序中引用时,库方法效果很好。 然而,在 ASP.NET Core2 web 服务中,虽然它编译没有错误,但它在运行时抛出异常:

异常 System.TypeLoadException 无法从程序集“Microsoft.VisualBasic,版本=10.0.3.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”加载类型“Microsoft.VisualBasic.FileIO.TextFieldParser”。

我怀疑这是因为与 Core 服务的某些不兼容。 我确实尝试将编译器标志从 NETCOREAPP2 更改为 NET461,但 Web 服务仍然抛出异常。

[这不完全是一个答案,但它是一种替代上述程序集的解决方案。]

我构建了这个类来替换 Microsoft.VisualBasic 中 FileIO.TextFieldParser 提供的功能,并使其与 API 兼容。 下面仅提供我需要的功能,因此可以根据需要进行扩展。

public class TextFieldParser : StreamReader
{
    int iToken = 1;
    bool quoted = false;
    char[] delimiters;
    string curLine;

    public TextFieldParser(string path) : base(path) { }

    public TextFieldParser(Stream stream) : base(stream) { }

    public string[] ReadFields()
    {
        curLine = ReadLine();

        return GetFields();
    }

    public void SetDelimiters(string delim)
    {
        delimiters = delim.ToCharArray();
    }

    public string[] GetFields()
    {
        if (delimiters == null || delimiters.Length == 0)
            throw new Exception($"{GetType().Name} requires delimiters be defined to identify fields.");

        if (!hasFieldsEnclosedInQuotes)
        {
            return curLine.Split(delimiters);
        }
        else
        {
            var token = (char)iToken;
            var sb = new StringBuilder();

            // Go through the string and change delimiters to token
            // ignoring them if within quotes if indicated
            for (int c = 0; c < curLine.Length; c++)
            {
                var qc = curLine[c];

                if (hasFieldsEnclosedInQuotes && qc == '"')
                {
                    quoted = !quoted;
                    continue;
                }
                else if (!quoted)
                {
                    // Replace the delimiters with token
                    for (int d = 0; d < delimiters.Length; d++)
                    {
                        if (qc == delimiters[d])
                        {
                            qc = token;
                            break;
                        }
                    }
                }

                sb.Append(qc);
            }

            return sb.ToString().Split(token);
        }
    }

    private bool hasFieldsEnclosedInQuotes = false;
    public bool HasFieldsEnclosedInQuotes
    {
        get { return hasFieldsEnclosedInQuotes; }
        set { hasFieldsEnclosedInQuotes = value; }
    }

    public bool EndOfData
    {
        get { return EndOfStream; }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM