2017-12-27 45 views
0

Microsoft.VisualBasic 어셈블리가 ASP.NET Core2와 호환되지 않습니까?System.TypeLoadException Microsoft.VisualBasic ASP.NET 핵심 2

CSV 파일을 읽는 방법을 제공하는 C# 클래스 라이브러리가 있는데 파일을 읽을 때 Microsoft.VisualBasic.FileIO.TextFieldParser를 사용하기로했습니다. 라이브러리 메서드는 WPF 앱에서 참조 될 때 훌륭하게 작동합니다.

예외 어셈블리에서 형식 'Microsoft.VisualBasic.FileIO.TextFieldParser'를로드 할 수 없습니다 System.TypeLoadException : 오류없이 컴파일하지만 그러나, ASP.NET 코어 2 웹 서비스에서, 그것은 런타임 예외가 발생합니다 'Microsoft.VisualBasic, 버전 = 10.0.3.0, 문화 = 중립, PublicKeyToken = b03f5f7f11d50a3a'.

이것은 서비스가 코어와 호환되지 않기 때문인 것으로 생각됩니다. 컴파일러 플래그를 NETCOREAPP2에서 NET461로 변경하려고했지만 웹 서비스가 여전히 예외를 throw합니다.

+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; } 
    }