相关疑难解决方法(0)

从Nuget包中提取的自动本机和托管DLL

这让我疯狂了几个月,我仍然无法实现它.我的托管库是从Nuget包中提取的,但不是本地的.

我们有一堆由其他公司提供的托管和本地库.我们有它们x86x64它们的版本.为了在ASP.NET Core项目中使用它们,我必须创建一个Nuget包.

我的架构是:

  • 我更改为仅针对完整.NET Framework的ASP.NET Core类库.这个项目引用了我的Nuget包
  • 一个ASP.NET Core网站,也是针对完整的.NET Framework并引用类库

当然,最后,我需要将我的本机库提取到网站的正确运行时文件夹(例如:) \bin\Debug\net461\win7-x64.

目前我的解决方案是:

  • 将本机库放在build文件夹中
  • 创建一个targets将它们复制到的文件$(OutputPath)(甚至不是运行时文件夹)
  • 添加一些MsBuild命令到xproj我的网站,以获取我的$(USERPROFILE)\.nuget\packages\文件夹中的目标文件并执行它
  • 手动复制现在在bin文件夹中提取的本机DLL 到runtime一个

我试图使用一些配置直接将它们复制到运行时文件夹中project.json(我真的不记得我为这部分尝试过的所有事情),但这总是失败.即使我SkipUnchangedFiles="true"在我的目标文件中指定,这只是被忽略,我的DLL在每次构建期间被复制到我的bin文件夹.

这是一个重要的过程,只是为了实现DLL提取,现在我真的想摆脱所有MsBuild并得到一个更简单的解决方案.

我知道Nuget的新版本,它现在能够在没有添加自定义MsBuild命令的任何帮助的情况下原生提取它们.至于写在这里,C#项目甚至不需要一个targets文件

接下来,可能使用NuGet包的C++和JavaScript项目需要.targets文件来标识必要的程序集和winmd文件.(C#和Visual Basic项目会自动执行此操作.)

我在我的浏览器中打开了一个标签,持续了几个月(原始链接),并意识到此资源最近已从Nuget网站上删除.它解释了如何使用该runtimes文件夹自动提取本机DLL.然而,我从来没有能够得到一个成功的结果,因为它被解释.现在,这个页面已被删除,取而代之的这一个有这么一些解释,而不是谈论这个runtimes文件夹的.

我的猜测是我应该使用runtimes本机DLL的文件夹和lib托管的那个,但我不是100%肯定.(我也应该使用该build文件夹吗?)

我已经尝试了几件事(我记不起尝试次数,正如我所说的几个月的头痛......)就像这样的架构(我不明白这有什么意义,build/native还有本机文件夹runtimes) 在此输入图像描述

我还尝试使用此处描述的.NET框架版本结构用于托管库.

似乎也是解决方案的一部分

创建程序集引用时,编译器会忽略该体系结构.这是一个加载时间概念.如果存在,加载程序将更喜欢体系结构特定的引用. …

c# nuget nuget-package .net-core asp.net-core

23
推荐指数
1
解决办法
5190
查看次数

来自 NuGet 包的 DllImport 本机依赖项不适用于 net472,但适用于 netcoreapp2.2

我的项目目前在 .NET Core (Linux/OSX/Windows/ netcoreapp2.2)上完美运行。它也应该工作net472,但由于某种原因,DllImport没有找到本机依赖项。

可以在此处找到一个简单的重现,但我将在此问题中进一步扩展以供后代使用。

这是包含本机依赖项的打包项目。

<Project Sdk="Microsoft.NET.Sdk">
  <Import Project="../../build/common.props" />
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <RuntimeIdentifier>win-x64</RuntimeIdentifier>
    <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences>
    <EnableDefaultItems>false</EnableDefaultItems>
    <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
    <IncludeBuildOutput>false</IncludeBuildOutput>
  </PropertyGroup>
  <ItemGroup>
    <ProjectReference Include="..\net\Qml.Net\Qml.Net.csproj" />
  </ItemGroup>
  <ItemGroup>
    <Content Include="output/**/*">
      <PackagePath>runtimes/win-x64/native/</PackagePath>
      <Pack>true</Pack>
    </Content>
  </ItemGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

这将生成具有以下输出的 NuGet 包。

??? [Content_Types].xml
??? package
?   ??? services
?       ??? metadata
?           ??? core-properties
?               ??? e803485f4a674e8d9d0155224fa9cbc2.psmdcp
??? Qml.Net.WindowsBinaries.nuspec
??? _rels
??? runtimes
    ??? win-x64
        ??? native
            ??? QmlNet.dll

8 directories, 4 files
Run Code Online (Sandbox Code Playgroud)

这是我的消费项目。

??? [Content_Types].xml …
Run Code Online (Sandbox Code Playgroud)

.net pinvoke nuget

6
推荐指数
1
解决办法
351
查看次数

标签 统计

nuget ×2

.net ×1

.net-core ×1

asp.net-core ×1

c# ×1

nuget-package ×1

pinvoke ×1