Microsoft.VisualBasic程序集与ASP.NET Core2不兼容吗?
我有一个C#类库,它提供了一个读取CSV文件的方法,我选择使用Microsoft.VisualBasic.FileIO.TextFieldParser来读取文件。在WPF应用程序中引用时,库方法很有用。但是,在ASP.NET Core2 Web服务中,虽然它编译时没有错误,但它会在运行时抛出异常:
异常 System.TypeLoadException无法加载类型' Microsoft.VisualBasic.FileIO.TextFieldParser'来自assembly' Microsoft.VisualBasic,Version = 10.0.3.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'。
我怀疑这是因为与Core服务有些不兼容。我确实尝试将编译器标志从NETCOREAPP2更改为NET461,但Web服务仍然抛出异常。
答案 0 :(得分:2)
[这不是一个完全答案,但它是一个解决方案,可以代替上面的程序集。]
我构建了这个类来替换Microsoft.VisualBasic中的FileIO.TextFieldParser提供的功能,并且与它兼容API。以下仅提供我需要的功能,以便根据需要进行扩展。
public class TextFieldParser : StreamReader, IDisposable
{
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; }
}