Dot Net Core和Azure存储:无法加载文件或程序集System,版本= 4.0.0.0

时间:2016-09-04 14:56:01

标签: c# .net azure asp.net-core azure-storage

我在“netcoreapp1.0”上运行了一个使用Azure Storage Client的Web API。访问blob完全没有问题,但是当我尝试使用表执行任何操作时,它会抛出这个错误:

  

抛出异常:System.Private.CoreLib.ni.dll中的“Microsoft.WindowsAzure.Storage.StorageException”

     

其他信息:无法加载文件或程序集'System,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'。系统找不到指定的文件。

它发生的具体线条如下:

  

if(await table.ExistsAsync())

即使删除它,每当它遇到实际对Azure进行HTTP调用的行时,它仍然会产生相同的结果。我正在导入“net46”,我也尝试导入我的project.json“net40”,但没有变化。

上面的代码生活在“Cameo.Azure.Storage.Library”中。它的目标是netstandard1.6,它引用了“WindowsAzure.Storage”:“7.2.0”和“NETStandard.Library”:“1.6.0”。

我的project.json如下:

{
  "dependencies": {
    "Cameo.Azure.Storage.Library": "1.0.0-*",
    "Cameo.GeoLocation": "1.0.0-*",
    "LightInject": "4.0.11",
    "LightInject.Microsoft.DependencyInjection": "1.0.1",
    "LocationService.Domain": "1.0.0-*",
    "Microsoft.AspNetCore.Authentication.Cookies": "1.0.0",
    "Microsoft.AspNetCore.Authentication.JwtBearer": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Swashbuckle": "6.0.0-beta902"
  },

  "tools": {
    "Microsoft.AspNetCore.Server.IISIntegration.Tools": "1.0.0-preview2-final"
  },

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "net46",
        "net40"
      ]
    }
  },

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "xmlDoc": true
  },

  "runtimeOptions": {
    "configProperties": {
      "System.GC.Server": true
    }
  },

  "publishOptions": {
    "include": [
      "wwwroot",
      "Views",
      "Areas/**/Views",
      "appsettings.json",
      "web.config"
    ]
  },

  "scripts": {
    "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
  }
}

图书馆的project.json

{
  "version": "1.0.0-*",

  "dependencies": {
    "Cameo.Azure.Storage.Interface": "1.0.0-*",
    "LightInject": "4.0.11",
    "Microsoft.Extensions.Configuration": "1.0.0",
    "Microsoft.Extensions.Options": "1.0.0",
    "NETStandard.Library": "1.6.0",
    "WindowsAzure.Storage": "7.2.0"
  },

  "frameworks": {
    "netstandard1.6": {
      "imports": [
        "net46"
      ]
    }
  }
}

2 个答案:

答案 0 :(得分:4)

您无法在.NET Core中使用.NET 4.0或.NET 4.6程序集。您需要支持.NET Core(如果有)或目标.NET Core的版本。

您在以下部分中所做的只是绕过NuGet目标检查

  "frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "net46",
        "net40"
      ]
    }
  },

但这并不会让.NET 4.x库与.NET Core一起使用。 .NET Core库需要定位netstandard1.xnetcoreapp1.0(还有一些 - 但不是全部 - 为Windows Phone 8,8.1或10设计的可移植类库这可能有效,但取决于特定的库),以便与.NET Core一起运行。

最重要的是,您甚至在项目中引用了ASP.NET MVC 5的库,这肯定不会起作用,因为.NET Core中没有System.Web.*(它紧密耦合到IIS)。

您需要Microsoft 7.2版本的WindowsAzure.Storage软件包,它支持.NET Core,可以在NuGet here上找到。

答案 1 :(得分:0)

将web API中的project.json更改为已解决了这个问题。

"frameworks": {
    "netcoreapp1.0": {
      "imports": [
        "portable-net45+win8"
      ]
    }
  }

您只能导入框架的核心或可移植(PCL)版本。参考:

https://blogs.msdn.microsoft.com/cesardelatorre/2016/06/28/running-net-core-apps-on-multiple-frameworks-and-what-the-target-framework-monikers-tfms-are-about/

  

仅对.NET Core和PCL(可移植类库)的版本使用“导入”非常重要。将它与传统.NET Framework中的TFMS一起使用可能会导致问题或故障。