如何加载自定义DLL取决于的Nuget软件包



我正在通过门户(不是本地开发)开发功能应用程序。我有一个自定义dll,取决于1个nuget软件包:实体框架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,版本= 6.0.0.0, 文化=中性,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 代码并用此行替换,所有这些都可以正确执行并记录您的期望:

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
{
}

为了消耗来自引用软件包的汇编,您可以将自定义依赖项部署为私有汇编

  • 将汇编部署到bin文件夹中,在您的功能文件夹(例如wwwrootmyfunctionbin
  • 参考没有相对路径的组件,仅通过文件名(例如Library.dll

如果您想使用共享的组件,部署到公共位置并如上所述,则需要以其依赖关系部署程序集(本质上是项目构建的输出)。

如果您想利用共享模型,我建议您建议的另一个选项是将依赖性部署为nuget软件包(您可以将其部署到托管的自定义源或文件),该软件包将指定其软件包依赖项,并且将自动解决。

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

在解决方案资源管理器中,展开项目,参考,右键单击EntityFramework,属性,设置copy local = true。

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

最新更新