2017-12-27 20 views
0

Microsoft.VisualBasicアセンブリはASP.NET Core2と互換性がありませんか?System.TypeLoadException Microsoft.VisualBasic ASP.NETコア2

私はCSVファイルを読み込むためのメソッドを提供するC#クラスライブラリを用意しており、Microsoft.VisualBasic.FileIO.TextFieldParserを使用してファイルを読み込むことを選択しました。ライブラリメソッドは、WPFアプリケーションで参照されたときに効果的です。しかし、それはエラーなしでコンパイルが、それは実行時に例外をスローし、ASP.NET Core2のWebサービスに:

例外 System.TypeLoadExceptionは、アセンブリから型「Microsoft.VisualBasic.FileIO.TextFieldParser」をロードできませんでした'Microsoft.VisualBasic、Version = 10.0.3.0、Culture =ニュートラル、PublicKeyToken = b03f5f7f11d50a3a'。

これは、サービスがコアであることと互換性がないと思われます。私はNETCOREAPP2からNET461にコンパイラフラグを変更しようとしましたが、Webサービスはまだ例外をスローします。

+0

私はCsvHelperにコアサポートがあると思います。 – asawyer

答えて

0

[これは正確な答えはありませんが、それは上記のアセンブリの代わりに機能するソリューションである。]

私は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; } 
    } 
関連する問題