目前我的解决方案中有两个项目:Windows类库(针对.NET Framework 4.6.1)和另一个面向.NET Standard 1.3的类库.我正在使用Visual Studio 2015 Update 3.
我从其他项目添加了对.NET Standard项目的引用,它出现在引用列表中,但是当我想使用它时,我看不到引用库中的任何类或命名空间(即使引用的库已成功构建且没有错误).
这是.NET标准库项目的project.json:
{
"version": "1.0.0-*",
"dependencies": {
"NETStandard.Library": "1.6.0"
},
"frameworks": {
"netstandard1.3": {
"imports": "dnxcore50"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为.NET 4.6.1项目可以使用.NET Standard 1.3库,我甚至尝试使用较低版本(1.0),但结果是一样的.我在这里错过了什么?
如果我跑
dotnet恢复
它也工作正常:
log : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Entities\project.json...
log : Restoring packages for C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.json...
log : Writing lock file to disk. Path: C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\project.lock.json
log : C:\Users\Zsolt\Documents\Visual Studio 2015\Projects\PWB\PWBSpreadsheet.Parser\PWBSpreadsheet.Parser.xproj
log : Restore completed in 408ms. …
Run Code Online (Sandbox Code Playgroud) 我有一个.Net标准库,我在尝试使用其中一个依赖库时遇到错误,我认为这是一个版本冲突.在旧式.Net类库中,我可能会添加如下内容:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.0.0" newVersion="10.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是,我显然不能在Net Standard库中这样做; 所以,我的问题是,在.Net标准世界中解决此类问题的策略是什么?
我正在尝试引用一个 nuget 包,它显然是.NetStandard2.0
. 我们拥有此包的源代码并将其写入目标 .netstandard。我们确实有一个 CI 管道,因此当我们推送此代码时,它会构建和发布 nuget 包。当我尝试将生成的 nuget 包引用到我当前的 .netCore 应用程序中时,出现以下错误:
was restored using '.NETFramework,Version=v4.6.1' instead of the project target framework '.NETCoreApp,Version=v2.1'. This package may not be fully compatible with your project.
这对我来说没有任何意义。到目前为止,我已经尝试了以下调试步骤:
dotpeek
以确保它实际上是一个 .netstandard 包。不知道是什么让它认为它在任何时候都是针对的。下面是我的 .csproj 配置的样子
<TargetFramework>netstandard2.0</TargetFramework>
不确定这里是否有任何其他配置块重要,但如果您需要更多信息,请告诉我。有任何想法吗?
我现在正在移植一些使用表达式到.Net Core
应用程序的库,并遇到了一个问题,我的所有逻辑都基于这个问题LambdaExpression.CompileToMethod
.这里是示例代码:
public static MethodInfo CompileToInstanceMethod(this LambdaExpression expression, TypeBuilder tb, string methodName, MethodAttributes attributes)
{
...
var method = tb.DefineMethod($"<{proxy.Name}>__StaticProxy", MethodAttributes.Private | MethodAttributes.Static, proxy.ReturnType, paramTypes);
expression.CompileToMethod(method);
...
}
Run Code Online (Sandbox Code Playgroud)
是否有可能以某种方式重写它以使用表达式生成方法成为可能?我已经可以使用Emit
但它非常复杂,我想避免它支持高级表达式.
我尝试使用var method = expression.Compile().GetMethodInfo();
但在这种情况下我收到一个错误:
System.InvalidOperationException:无法从其他模块导入全局方法或字段.
我知道我可以手动发出IL,但我需要完全转换Expression
- > MethodInfo
绑定到特定TypeBuilder
而不是DynamicMethod
在它上面构建自己.
我正在将库项目迁移到.net标准,当我尝试使用System.Reflection
API调用时,我收到以下编译错误Type:GetProperties()
:
类型不包含'GetProperties'的定义
这是我的project.json
:
{
"version": "1.0.0-*",
"buildOptions": {
"debugType": "portable"
},
"dependencies": {},
"frameworks": {
"netstandard1.6": {
"dependencies": {
"NETStandard.Library": "1.6.0"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么?
我有一个预先存在的dotnet 4.6.2解决方案,它包含两个外部项目(同时移植)和一个共享core
库.
我需要选择核心组件TargetFramework
,它可以是netcoreapp2.0
或netstandard2.0
.
既然它不可执行,也不会被任何外部项目引用,那么这两种方式有什么优势吗?
(如果这个问题措辞不够,有人可以帮我清理一下吗?)
我有一个Azure功能(2.0),它依赖于一些System.Drawing代码.我添加了一个NuGet引用System.Drawing.Common(4.5.0).
但是,在发布应用程序后,调用该函数时,会产生错误:
System.Private.CoreLib:执行函数时出现异常:[MyFunctionName].System.Drawing.Common:此平台不支持System.Drawing.
据我所知,现在.NET Core支持System.Drawing.Common,我相信我的Azure功能正在运行的环境.但实际项目是.NET Standard 2.0项目.
我很困惑如何解决这个问题.我已经尝试将项目转换为.NET Core 2.1项目,但这导致了与"元数据生成失败"相关的奇怪错误,并且无法找到System.Runtime.
我的项目引用了Microsoft.Azure.WebJobs.Extensions.EventGrid(2.0.0-beta2),如果这是相关的.
azure .net-core azure-functions .net-standard azure-functions-runtime
我在 Xamarin.iOS 应用程序中使用 Entity Framework Core。
在包含在 iOS 应用程序和其他应用程序之间共享的代码 (.netstandard 2.0) 的核心项目中,我想知道是否需要迁移,以便我也可以执行一些其他操作。
这是上下文:
public void Initialize()
{
using (var dbContext = new MyDbContext(m_dbContextOptions))
{
--> bool isNeeded = demoTapeDbContext.Database.IsMigrationNeeded()
demoTapeDbContext.Database.Migrate();
}
}
Run Code Online (Sandbox Code Playgroud)
我发现的最接近的是调用该方法GetPendingMigrationsAsync()
并检查待处理迁移的数量,但我不确定这是否是在实体框架中进行此类检查的最安全方法:
public async Task InitializeAsync()
{
using (var dbContext = new MyDbContext(m_dbContextOptions))
{
bool isMigrationNeeded = (await demoTapeDbContext.Database.GetPendingMigrationsAsync()).Any();
demoTapeDbContext.Database.Migrate();
}
}
Run Code Online (Sandbox Code Playgroud) 所以现在似乎是一个悬而未决的问题.所以我想在完成这项工作之前我将不得不依赖.NET Core API参考并祈祷我不会打到其中一个,43 APIs that .NET Framework 4.6.1 doesn't support
但官方认为...
同样依赖.NET Core API参考并考虑与.NET标准相同可能会非常令人惊讶.例如,当我查看命名空间列表时,我可以看到,System.Drawing
但是当点击它时,我们意识到这是一个几乎空的命名空间,只包含6个结构.
有这样的几个名称空间吗?我不知道我必须比较.NET核心和.NET Framework文档才能得到答案.
我正在尝试找到.NET Standard API参考.
在此页面上只有指向.NET Core API reference
和的链接.NET Framework API reference
.
是的我已经搜索过,而且我已经阅读了其他的SO问题.例如,这个答案指向.NET Core API引用而不是.NET标准,并且在此Github问题源中也是如此
但.NET Core和.NET Standard是不同的..NET Core实现.NET标准API.
我在这里看到的一个大问题是例如基于官方文档 .NET Framework 4.6.1将实现.NET Standard 2.0
好的,除了.NET Standard Github自述页面也在说
另一方面,.NET Standard 2.0添加了许多.NET Framework 4.6.1已经支持的API.delta看起来如下:
.NET Standard 2.0添加了.NET Framework 4.6.1已支持的14,994个API
.NET Standard 2.0只有43个.NET Framework …
我的解决方案中有一个.NET Standard 2.0项目,我正在使用IConfiguration接口.当我写名称VS建议我引用Microsoft.Extensions.Configuration.Abstractions.dll.如果我这样做,则添加在参考节点下.但是我也可以将它添加为NuGet包.两种方式似乎都有效.我假设参考VS建议是通过项目中引用的.NET Standard SDK添加的.
添加该引用的推荐方法是哪种?每种方法有哪些优点和缺点?