如何加载自定义DLL所依赖的Nuget包?

时间:2017-02-27 05:19:08

标签: entity-framework azure-functions

我正在通过门户网站(而非本地开发)开发功能应用程序。我有一个依赖于1 nuget包的自定义DLL:Entity Framework 6.1.3

我已将我的DLL上传到" ../ bin"当我引用我的DbContext对象时,我的代码编译成功。到目前为止,非常好。

我还有一个 Project.json 文件,我看到它在保存时获取了nuget包。到目前为止,非常好。

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "EntityFramework": "6.1.3"
      }
    }
  }
}

我的 Run.csx 代码成功编译,如下所示:

#r "../bin/Library.dll"

using System;

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    log.Info("My code: Started");    
    log.Info(typeof(Library.MyContext).ToString());    
}

但是,代码实际上并没有运行(我甚至看不到"我的代码:已启动"日志项)。我收到的错误是:

  

2017-02-27T06:37:28.731执行函数时出现异常:   Functions.TimerTriggerCSharp1。 mscorlib:抛出了异常   调用的目标。 f-TimerTriggerCSharp1 __- 205940111:可以   不加载文件或程序集' EntityFramework,Version = 6.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089'或其中一个   依赖。系统找不到指定的文件。

我的自定义DLL是我可能制作的最简单的EF引用DLL。您需要重新创建的是:

自定义DLL packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net46" />
</packages>

自定义DLL Class1.cs

using System.Data.Entity;

namespace Library
{
    public class MyContext : DbContext
    {
    }
}

我做错了什么让我的自定义DLL无法使用下载的EntityFramework nuget包?

只是为了验证我的nuget引用实际上是否正常工作,如果我将 Run.csx 代码的大部分注释掉并用此行代替,则所有代码都会正确执行并记录您的期望:< / p>

log.Info($"My code: {typeof(System.Data.Entity.DbContext).ToString()}");

正如有人建议的那样,我已经尝试将我的 Run.csx 引用改为看起来像这样并且它没有改变我得到的运行时错误(它确实编译所以路径是正确的) :

#r "../../../data/Functions/packages/nuget/entityframework/6.1.3/lib/net45/EntityFramework.dll"
#r "../bin/My.dll"

我还可以更改 Run.csx 文件以包含此代码,并且它已成功执行:

using System;

public static void Run(TimerInfo myTimer, TraceWriter log)
{
    log.Info(typeof(MyContext).ToString());    
}

public class MyContext : System.Data.Entity.DbContext
{
}

2 个答案:

答案 0 :(得分:2)

为了使用来自您引用的包的程序集,您可以将自定义依赖项部署为私有程序集

  • 将程序集部署到功能文件夹中的bin文件夹中(例如wwwroot\myfunction\bin
  • 仅使用文件名(例如Library.dll
  • 引用没有相对路径的程序集

如果您希望使用共享程序集,部署到公共位置并按上述方式引用,则需要部署程序集及其依赖项(实际上是项目构建的输出)。

如果您想利用共享模型,我建议的另一个选择是将您的依赖项部署为NuGet包(您可以将其部署到托管在某处或作为文件的自定义源),然后该包将指定它的包依赖关系,它们都将自动解决。

答案 1 :(得分:0)

看起来配置问题,您需要在项目文件中定义要复制到输出的引用。

在Solution Explorer中,展开项目,References,右键单击EntityFramework,Properties,Set Copy Local = true。

有时默认值为false,因此它不会出现在项目的输出文件夹中。 我希望这会有所帮助。