- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
这让我疯狂了几个月,但我仍然无法实现它。我的托管库是从 Nuget 包中提取的,但不是从本地库中提取的。
我们有一堆由另一家公司提供的托管和本地库。
我们都有 x86
和 x64
他们的版本。为了在 ASP.NET Core 项目中使用它们,我必须创建一个 Nuget 包。
我的架构是:
\bin\Debug\net461\win7-x64
)。
build
文件夹 targets
将它们复制到 $(OutputPath)
的文件(甚至不是运行时文件夹)xproj
在我的网站中获取目标文件 $(USERPROFILE)\.nuget\packages\
文件夹并执行它 bin
中提取的 native DLL文件夹到 runtime
一 project.json
中的一些配置将它们直接复制到运行时文件夹中(老实说,我不记得我为这部分尝试过的所有事情)但这总是失败。即使我指定了
SkipUnchangedFiles="true"
在我的目标文件中,这只是被忽略,我的 DLL 会在每次构建期间复制到我的 bin 文件夹中。
targets
文件
Next, C++ and JavaScript projects that might consume your NuGet package need a .targets file to identify the necessary assembly and winmd files. (C# and Visual Basic projects do this automatically.)
runtimes
文件夹以自动提取 native DLL。但是,我从来没有像解释的那样获得成功的结果。现在该页面已被删除并替换为
this one解释这么少,不谈这个
runtimes
文件夹。
runtimes
native DLL 的文件夹和
lib
一个用于管理,但我不是 100% 确定。 (我还应该使用
build
文件夹吗?)
build/native
以及
runtimes
下的 natives 文件夹有什么意义)
The architecture is ignored by the compiler when creating an assembly reference. It's a load time concept. The loader will prefer an architecture specific reference if it exists.
One trick you can use to produce an AnyCPU assembly is to use corflags to remove the architecture from your x86 assembly. EG: corflags /32BITREQ- MySDK.dll. Corflags is part of the .NET SDK and can be found in VS's developer command prompt.
AnyCPU
(不知道它是否对 x64 DLL 起作用,但我没有收到错误)然后在我的 Nuget 包中尝试了几种不同的体系结构,但仍然无法正常工作。
win7-x64
,所以我决定明确指定它以防万一
"runtimes": {
"win7-x64": {}
},
所以这是我在 Nuget 包中进行所有尝试时使用的运行时标识符。但是我不关心 Windows 版本。我实际上更喜欢使用 win-x86 或 win-x64,但根据
this page,它似乎是一个无效值。
Windows RIDs
Windows 7 / Windows Server 2008 R2
- win7-x64
- win7-x86
Windows 8 / Windows Server 2012
- win8-x64
- win8-x86
- win8-arm
Windows 8.1 / Windows Server 2012 R2
- win81-x64
- win81-x86
- win81-arm
Windows 10 / Windows Server 2016
- win10-x64
- win10-x86
- win10-arm
- win10-arm64
win-x64
RID 或看看我是否可以包含一次我的托管库,无论 .NET Framework 版本是什么。
最佳答案
我将尽可能详细地解释我所经历的所有痛苦和解决方案。在我的示例中,我使用简单的文本文件 AAA86.txt
, AAA64.txt
和 AAAany.txt
而不是 native DLL 来简单地演示提取过程。
您需要知道的第一件事:
如果您尝试混合 native
NuGet 的架构与 lib
包含一些托管库的文件夹,它不会工作
在这种情况下,您的托管 DLL 将被复制到您项目的输出目录,而不是您的 native 目录。
感谢 Jon Skeet 为我指出了好的方向,建议我看看 Grpc.Core package .诀窍是创建一个 targets
将处理 DLL 提取的文件。
你的目标文件应该包含这样的内容
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Condition=" '$(Platform)' == 'x64' ">
<Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x64\native\AAA64.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>AAA64.txt</Link>
</Content>
</ItemGroup>
<ItemGroup Condition=" '$(Platform)' == 'x86' OR '$(Platform)' == 'AnyCPU' ">
<Content Include="$(MSBuildThisFileDirectory)..\..\runtimes\win-x86\native\AAA86.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>AAA86.txt</Link>
</Content>
</ItemGroup>
</Project>
.targets
文件的名称与您的 AssemblyName 相同。因此,如果您的程序集名称是
DemoPackage
,你的目标文件应该命名为
DemoPackage.targets
.否则,
.targets
在另一个项目中引用包时可能不会应用文件。
win7-x64
文件夹......)
project.json
也完全没用
{
"buildOptions": {
"platform": "x64"
}
}
win
和/或
win-x64
"runtimes": {
"win": {},
"win-x64": {}
}
win7-x64
.但是如果你加上
win10-x64
当你在 Windows 10 机器上时,这将被使用
dotnet build -c debug -r win
targets
文件将接收您机器的架构(在我的情况下为 x64)而不是
AnyCPU
正如我所期待的
runtimes/RID/native
,提取将在没有目标文件的情况下工作。
win-x64
正如我告诉您的那样,使用 Visual Studio 构建始终创建的运行时文件夹是
win7-x64
,无论我选择哪种配置。如果我只有一个
win
RID 在我的包中,然后它会成功被选中。
关于c# - 从 Nuget 包中自动提取 native 和托管 DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104838/
我会尝试尽可能详细地描述我的问题,但如果需要更详细的解释,请告诉我。 为了简化,假设我有 3 个 DLL(实际上我有更多,但我猜这不是很重要): managed-1.dll - 托管 DLL(用 C#
我有一个 Tomcat 6 JSF Web 应用程序,我想使用 CDI bean 来设置它。不过,我必须逐渐将项目转换为 CDI。 我的问题是:CDI bean 和传统的 JSF 托管 bean 可以
我计划将 Web 应用程序从使用 JSF 托管 Bean 转换为使用 CDI 托管 Bean。我知道我需要执行以下操作: 在 WEB-INF 中添加一个空 beans.xml 文件。 将所有 JSF
我在裸域上运行我的解析应用程序。 Parse 并没有让我的生活变得轻松。 起初我很难设置它,因为大多数 DNS 托管服务不允许根域上的 CNAME,而 Parse 需要 CNAME。 决定尝试使用 C
如果您使用 Firebase 托管 将请求定向到 云函数 通过重写,“通过”托管的请求流量是否会记入 Firebase 托管 国标转出 ? (忽略 Cloud Function 的计费) 换句话说,
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我有一个特定的用例,我正尝试使用 Firebase 托管来解决,它如下: 我正在使用 Gridsome 生成静态网站 在构建之前,Gridsome 使用 Graphql 并从 Headless CMS
您好,我有一个blazor页面,我想在其中显示一个变量。 这个变量从另一个线程(通过Websocket接收数据的另一个线程)获取更新,我想以线程安全的方式显示它: Blazor页面 @page "/n
我想使用 Firebase 托管来托管一个 angular 应用程序,我需要创建一个重定向到另一个 URL 中的一些旧文件。 根据 Firebase 文档,您可以进行基本重定向 "redirects"
我正在尝试找出满足电子学习平台以下要求的最佳方法。 我在其中编辑视频的后端,以便可以将它们彼此链接(例如youtube-comment函数) 用户只能在访问平台时观看视频(不允许下载!) 视频只能通过
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
我想这是一个相当深入的主题,因此任何带有洞察信息的网址也很乐意接受。我一直在使用原生 DirectX,但从未管理过。另一方面,大多数情况下,在开发不需要高级 GPU 渲染的其他类型的应用程序时,我通常
我刚刚将一个网站部署到 Firebase 托管,效果非常好 - 设置非常简单。 但是,我的问题是,有什么方法可以使访问该网站受到身份验证的限制吗?这是一个管理面板,只有我的团队才能访问。有什么方法可以
已关闭。这个问题是 not about programming or software development 。目前不接受答案。 这个问题似乎不是关于 a specific programming
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找书籍、工具、软件库、教程或其他场外资源的问题对于 Stack Overflow 来说是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 6 年前。
我刚刚将一个网站部署到 Firebase 托管,它运行良好 - 设置非常简单。 但是,我的问题是,有什么方法可以通过身份验证限制对网站的访问?这是一个只有我的团队才能访问的管理面板。有什么方法可以用密
如果我想托管一个对公众用处不大的应用程序(例如,一个将点打印到控制台的程序,它们的数量取决于现在的时间),我喜欢在启动板中的方式不必乱扔全局托管站点的命名空间并用诸如 HourDot 之类的名称填充它
我是一名优秀的程序员,十分优秀!