【问题标题】:How to use publish options in class library project.json?如何在类库 project.json 中使用发布选项?
【发布时间】:2016-12-05 09:39:49
【问题描述】:

我有外部 dll,我想将其包含在项目中。 我无法将此 dll 添加为标准库(它是 c++ dll)。

我正在为外部 dll 使用 DllImport。

[DllImport("MyExternal.dll")]
public static extern UInt32 Authent([Out] UInt32[] LibRandNum);

如果我在主项目中包含 dll,这将起作用:

 "publishOptions": {
    "include": [
      "MyExternal.dll"
    ]
  }

但它不适用于类 libaray(类库 project.json 文件中的相同发布选项)。

如果我将 dll 添加到“C:\windows\system32”,则它可以正常工作。但我不想假设 dll 存在,我想从项目库中添加 dll。

编辑 1:

我找到了"How to use native dependencies",但仍然无法正常工作。 我不知道如何使用 nuget 包,但我想尽可能避免使用 nuget。

编辑 2:

类似于this,但在核心类库中。

编辑 3

我试过了:

"copyToOutput": {
  "include": [ "MyExternal.dll" ]
}

仍然没有成功。

编辑 4

我创建了最小的解决方案(.NET 核心 - Visual Studio 2015)。你可以到这里:http://www.filedropper.com/myapp_1

类库中有dll文件(SGLW64.dll)

如果您将此 dll 添加到 C:\Windows\System32 中,则它可以正常工作。

【问题讨论】:

  • 外部dll是否复制到本地dll/exe所在的位置?
  • 我以为是 dll/exe 所在的位置。但是现在我找不到了。所以我不知道。
  • 如果它不在 dll/exe 旁边,则在导入时将无法找到它,因此无法正常工作
  • 创建一个包含本机 dll 的包,并使其成为使用它的包的依赖项。确保包含本机 dll 的包具有正确的结构。我不久前写了一篇关于此的博客文章:blog.3d-logic.com/2015/11/10/…。虽然我在 dnx 时代写过,但大部分内容仍然适用(项目引用除外)

标签: c# dll asp.net-core


【解决方案1】:

不幸的是,copyToOutput 在project.json 中不能传递。有关详细信息,请参阅GitHub Issue。这很可能会在转换回 MSBuild 后得到解决,但现在我们必须手动管理这些依赖项。

由于我们不能将 copyToOutput'ed 资源从 ClassLibrary 传递到 MyApp,我们必须告诉 MyApp 在哪里可以找到 .dll 以及将其放置在哪里。由于我们希望将 .dll 与 ClassLibrary 一起分发,这意味着 MyApp 必须使用相对路径来获取它。在这里,我们可以利用copyToOutput 中的mappings 对象,这使我们能够大量控制从何处获取文件以及将它们放置在何处。如果您尝试使用include 而不是mappings,您最终会得到.dll 所在的整个文件夹结构。

将此添加到 MyApp 的 project.json 中的 buildOptions 和 publishOptions:

"copyToOutput": {
   "mappings" : {
      "SGLW64.dll": "../ClassLibrary/SGLW64.dll"
   }
}

虽然 MyApp 必须通过手动复制其 .dll 来“了解”ClassLibrary 的内部实现细节并不是一件好事,但这是我们在回到 MSBuild 之前需要做出的妥协。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多