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

Entity framework 如何加载自定义DLL所依赖的Nuget包?,entity-framework,azure-functions,Entity Framework,Azure Functions,我正在通过门户开发一个功能应用程序(不是本地开发)。我有一个自定义DLL,它依赖于1个nuget包:Entity Framework 6.1.3 我已将DLL上载到“./bin”,当我引用我的DbContext对象时,我的代码成功编译。到目前为止,一切顺利 { "frameworks": { "net46":{ "dependencies": { "EntityFramework": "6.1.3" } } } } 我还有一个Pr

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

我已将DLL上载到“./bin”,当我引用我的
DbContext
对象时,我的代码成功编译。到目前为止,一切顺利

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "EntityFramework": "6.1.3"
      }
    }
  }
}
我还有一个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());    
}
但是,代码实际上并没有运行(我甚至没有看到“MyCode:Started”日志项)。我收到的错误是:

2017-02-27T06:37:28.731执行功能时出现异常: Functions.TimerTriggerCSharp1。mscorlib:异常已由引发 调用的目标。f-TimerTriggerCSharp1_uuu-205940111:可能 未加载文件或程序集的EntityFramework,版本=6.0.0.0, 区域性=中性,PublicKeyToken=b77a5c561934e089'或其 依赖关系。系统找不到指定的文件

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

自定义DLL包。配置:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="6.1.3" targetFramework="net46" />
</packages>
我做错了什么,使我的自定义DLL无法使用下载的EntityFramework nuget软件包?


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

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

正如有人建议的那样,我已尝试将我的Run.csx引用更改为如下所示,但它不会更改我得到的运行时错误(它会编译以确保路径正确):


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

using System;

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

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

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

在解决方案资源管理器中,展开项目引用,右键单击EntityFramework属性,设置Copy Local=true

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

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

  • 将程序集部署到功能文件夹中的
    bin
    文件夹中(例如
    wwwroot\myfunction\bin
  • 仅按文件名引用不带相对路径的程序集(例如
    Library.dll
如果您希望使用共享程序集,将其部署到公共位置并如上所述进行引用,则需要部署程序集及其依赖项(基本上是项目生成的输出)


如果您想利用共享模型,我建议的另一个选项是将依赖项部署为NuGet包(您可以将其部署到某个地方托管的自定义源或作为文件),然后该包将指定其包依赖项,并自动解决所有这些依赖项。

FYI,我重写了这个问题,以大大简化运动部件。这是一个非常简单的设置,熟悉函数的人可以在<5分钟内复制。如果您将
EntityFramework.dll
复制到
bin
文件夹,会怎么样?@Mikhail我已经尝试过了,并且
#r
“它就像我的自定义dll一样,不起作用-相同的错误消息。在这和GH问题之间,我有所有需要重述的信息。如果我有任何其他问题,我会跟进你。我认为这不是问题,除非你能给我更多的信息。这些DLL是由服务器上的Azure函数获取的-我不必使用Copy Local将它们获取到那里。此外,我还尝试使用自己的自定义DLL部署nuget获得的DLL,但仍然不起作用。你建议我把nuget获得的DLL放在哪里?我想确认一下我把它们放在了正确的地方。我没时间了,不得不把我的东西换成WebJobs。下次我会在私人集会上试试你的建议。我之前曾尝试过你的建议,但它没有改变行为(很快就改变了,所以可能我弄糟了什么)-我尝试过使用和不使用引用它们的
#r
语句。
#r
语句的顺序重要吗?可能是我弄错了?顺序不重要。如果您在尝试时发现任何问题,请告诉我们。
using System;

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

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