所有关于.Net Standard的讨论都让我感到困惑.从某种意义上说,标准.NET库的想法听起来很棒.我注意到在NuGet库中,您可以为许多平台选择.NET Standard(例如Silverlight).但这让我感到困惑..NET标准是一个库吗?还是DLL格式?
无论如何,现在有.NET Core项目,以及旧的PCL项目,但我没有看到.NET Standard的任何Visual Studio模板.虽然,我确实发现如果你进入项目的设置,你可以将现有的PCL库切换到.NET Standard.
无论如何,我要问的基本问题是我们应该针对哪种类型的库?我主要是为Xamarin项目做这个,但如果我们可以与其他平台共享这些库,那将会很棒,特别是.NET Core和UWP.
但是,我真的很困惑为什么微软同时推出了两个看似相同的库类型:.NET Core和.NET Standard.
编辑:我现在对此更加困惑.我正在编辑原帖,因为我还没有完全回答我自己的问题.以下是我认为理解这些事情的关键.我愿意接受更正.
定义
NET Core - 基于.NET的运行时环境,符合.NET标准API定义.
PCL - 基于.NET的库格式,由多个运行时环境支持,包括.NET,Mono,Windows Phone等
.NET Standard(定义1) - 基于.NET的运行时环境的一组标准API定义
.NET标准(定义2) - 基于.NET的库格式,由多个运行时环境支持,包括.NET,Mono,Windows Phone等,这是PCL格式的延续.在Visual Studio中,可以通过访问项目的属性并编辑目标框架将PCL库转换为.NET标准库.
有很多关于如何在 Entity Framework 中禁用延迟加载的帖子,但相同的技术在 EF Core 中不起作用。我LazyLoadingEnabled
在更改跟踪器中找到了该属性,但这似乎根本不起作用。
EF 中的一切都指向了这一点:
this.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)
但是,Configuration
EF Core 中缺少该属性。
这是我正在谈论的一个例子:
public class TestContext : DbContext
{
public DbSet<Person> People { get; set; }
public DbSet<Address> Addresses { get; set; }
public TestContext()
{
this.ChangeTracker.LazyLoadingEnabled = false;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
var connection = new SqliteConnection($"Data Source=Test.db");
connection.Open();
var command = connection.CreateCommand();
command.CommandText = $"PRAGMA foreign_keys = ON;";
command.ExecuteNonQuery();
optionsBuilder.UseSqlite(connection);
optionsBuilder.UseLazyLoadingProxies(false);
base.OnConfiguring(optionsBuilder);
}
private static void Main(string[] args) …
Run Code Online (Sandbox Code Playgroud) 我创建了一个新的Xamarin Forms解决方案,升级了所有NuGets,确保UWP版本的目标是构建16299,并确保.NET Standard项目的目标是2.0.我运行该项目,并能够很好地调试.NET Standard 2.0 DLL.你可以在这里下载,但我认为它没有任何用处:https://www.dropbox.com/s/jw13heu98yq2n6x/CleanXF.7z?dl = 0.
然后我将这些项目拉到另一个解决方案中,添加了一些对其他项目的引用,并将一些Xamarin Forms页面等复制并粘贴到新的清洁项目中.然后我可以编译并运行该项目,但调试.NET Standard 2.0 Xamarin Forms项目根本不起作用.调试UWP代码确实有效,而较低级别的.NET Standard 2.0项目会进行调试.它只是一个不会调试的项目.我已经尝试过Git一次又一次地清理文件夹以确保重建正在进行.我也尝试从头开始创建项目并重新添加所有文件.再次,它编译并运行,但不调试.
我可以尝试哪些方法来调试工作?
Android Studio 附带的标准 Android 模拟器是 QEMU CPU 模拟器的衍生版本。QEMU 支持USB 直通。即,您可以将 USB 设备连接到计算机,Android 模拟器应该会拾取该设备,就像它已连接到模拟手机一样。我需要让它工作,以便我可以通过 Android 模拟器调试传输到 USB 设备( Trezor 硬件钱包)。
显然,我们可以使用参数将 QEMU 命令行参数传递给 Android 模拟器-qemu
。我拼凑了这个我认为正确的电话:
emulator -avd pixel_2_pie_9_0_-_api_28 -qemu -usb -device usb-host,vendorid=4617,productid=21441
但是,我收到这些错误:
C:\Program Files (x86)\Android\android-sdk\emulator>emulator -avd Pixel_2_pie_9_0_-_api_28 -qemu -usb -device usb-host,vendorid=4617,productid=21441 无法打开 /qemu.conf,错误: 2 Windows Hypervisor Platform 加速器可运行 C:\Program Files (x86)\Android\android-sdk\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe: libusb_kernel_driver_active: -12 [NOT_SUPPORTED] C:\Program Files (x86)\Android\android-sdk\emulator\qemu\windows-x86_64\qemu-system-x86_64.exe: libusb_kernel_driver_active: -12 [不支持] C:\Program Files (x86)\Android\android-sdk\emulator\ qemu\windows-x86_64\qemu-system-x86_64.exe: libusb_kernel_driver_active: -12 [不支持] C:\Program Files (x86)\Android\android-sdk\emulator\qemu\windows-x86_64\qemu-system-x86_64。 exe: libusb_kernel_driver_active: -12 [不支持] C:\Program Files …
我有一个UWP应用。我正在使用Visual Studio 2017 15.4.1。UWP应用程序是一种商店应用程序,已部署到Microsoft Store。我的应用程序在商店中运行良好,并且在Visual Studio中播放时也运行良好。然后最近发生了一个孤立的存储问题,因此我进入“应用程序和功能”中的应用程序,然后单击高级选项->重置。不知何故,这炸毁了我在计算机上安装的应用程序。我们的应用不再显示为已安装的应用,当我尝试从商店中安装该应用时,出现错误,代码为0x80073CF9。因此,我无法卸载或在计算机上重新安装。我试过运行sfc / scannow等,以找出问题所在,但似乎无济于事。
这甚至不必担心太多,但现在甚至无法开发,因为当我尝试从Visual Studio运行应用程序时,出现以下错误:
为了调试该项目,您必须从Windows Store应用程序项目中使用它,该项目会创建一个程序包并将其标记为Startup Project。
我在构建的输出窗口中收到此错误
4> DEP0700:应用程序注册失败。[0x80073CF9]另一个用户已经安装了此应用程序的未打包版本。当前用户不能用打包的版本替换它。冲突的软件包是[APP NAME],它是由CN = [Publisher]发布的。
我做错什么了?
在 WPF 和其他基于 XAML 的技术中,有一个名为 CollectionViewSource 的类。它很有用,因为不是过滤和排序内联等,而是在实际集合的顶部放置一个层,并且只将排序/过滤的视图暴露给 UI。这意味着模型将保持干净,而 UI 可以排序或过滤。Xamarin Forms 中是否有等效项?
List<> 类有一个完美的排序方法。但是,List<> 没有实现 INotifyCollectionChanged。是否有实现 INotifyCollectionChanged 和 Sort 方法的 List?
我试图用CloseHandle释放USB接口的句柄.我得到的例外是:
System.Runtime.InteropServices.SEHException(0x80004005):外部组件引发了异常.位于Usb.Net.Windows.UsbInterface.Dispose()的Device.Net.APICalls.CloseHandle(SafeFileHandle hObject)位于C:\ GitRepos\Device.Net\src\Usb.Net\Windows\UsbInterface.cs:
位于Usb的第23行C:\ GitRepos\Device.Net\src\Usb.Net\Windows\WindowsUsbDevice.cs中的.Net.Windows.WindowsUsbDevice.Dispose():第131行
我试图在我班级的Dispose方法中这样做.
编辑背景:我试图这样做的原因是我的代码在第二次运行时崩溃了.根据这篇文章,我必须在我使用CreateFile创建的设备的句柄上调用CloseHandle.无论如何,这都是在我的代码中完成的,因为设备的句柄因为是SafeFileHandle而被处理掉了.但是,有人告诉我,我需要在接口的句柄上调用CloseHandle.我不知道这是不是真的.我试图这样做,以排除不调用CloseHandle是错误的原因的可能性.基于其他评论和研究,我现在认为这是一个错误,并且调用WinUsb_Free就足够了.它是否正确?
Hans Passant的回答告诉我要删除对CloseHandle的调用,但正如我在评论中指出的那样,原始代码(在master中)从未调用过CloseHandle.当然,删除电话会有效,但这不是问题.下面的问题是:使用WinUSB API释放USB接口的过程是什么?.它只是简单地调用WinUsb_Free?这就是我所拥有的所有信息都让我相信.
这是我提出这个问题之前的原始处置方法.它没有调用CloseHandle.
public void Dispose()
{
if (_IsDisposed) return;
_IsDisposed = true;
var isSuccess = WinUsbApiCalls.WinUsb_Free(Handle);
WindowsDeviceBase.HandleError(isSuccess, "Interface could not be disposed");
}
Run Code Online (Sandbox Code Playgroud)
来自WindowsUsbInterface(https://github.com/MelbourneDeveloper/Device.Net/blob/9ebc122a2755dda2824c6eda961d092f2f6e83b5/src/Usb.Net/Windows/WindowsUsbDevice.cs#L122):
public override void Dispose()
{
if (_IsDisposing) return;
_IsDisposing = true;
try
{
foreach (var usbInterface in _UsbInterfaces)
{
usbInterface.Dispose();
}
_UsbInterfaces.Clear();
_DeviceHandle?.Dispose();
_DeviceHandle = null;
base.Dispose();
}
catch (Exception ex)
{
Logger.Log("Error disposing of device", ex, nameof(WindowsUsbDevice)); …
Run Code Online (Sandbox Code Playgroud) 更新:查看底部的示例
我需要在课间发消息。发布者将无限循环,调用一些方法来获取数据,然后将该调用的结果传递给OnNext
. 可以有很多订阅者,但应该只有一个 IObservable 和一个长期运行的任务。这是一个实现。
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using System.Diagnostics;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Tasks;
namespace UnitTestProject1
{
[TestClass]
public class UnitTest1
{
private static string GetSomeData() => "Hi";
[TestMethod]
public async Task RunMessagingAsync()
{
var subject = new Subject<string>();
//Create a class and inject the subject as IObserver
new Publisher(subject);
//Create a class and inject the subject as IObservable
new Subscriber(subject, 1.ToString());
new Subscriber(subject, 2.ToString());
new Subscriber(subject, 3.ToString());
//Run the loop for 3 seconds
await …
Run Code Online (Sandbox Code Playgroud) c# publish-subscribe reactive-programming system.reactive reactiveui
应用程序需要加载数据并缓存一段时间。我希望如果应用程序的多个部分想要同时访问同一个缓存键,缓存应该足够智能,只加载一次数据并将该调用的结果返回给所有调用者。然而,MemoryCache
并不是这样做的。如果您并行访问缓存(这通常发生在应用程序中),它会为每次尝试获取缓存值创建一个任务。我认为这段代码会达到预期的结果,但事实并非如此。我希望缓存只运行一项GetDataAsync
任务,等待它完成,然后使用结果来获取其他调用的值。
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace ConsoleApp4
{
class Program
{
private const string Key = "1";
private static int number = 0;
static async Task Main(string[] args)
{
var memoryCache = new MemoryCache(new MemoryCacheOptions { });
var tasks = new List<Task>();
tasks.Add(memoryCache.GetOrCreateAsync(Key, (cacheEntry) => GetDataAsync()));
tasks.Add(memoryCache.GetOrCreateAsync(Key, (cacheEntry) => GetDataAsync()));
tasks.Add(memoryCache.GetOrCreateAsync(Key, (cacheEntry) => GetDataAsync()));
await Task.WhenAll(tasks);
Console.WriteLine($"The cached value was: {memoryCache.Get(Key)}");
}
public static async Task<int> GetDataAsync()
{
//Simulate getting a large …
Run Code Online (Sandbox Code Playgroud) 我需要将日历条目推送到客户端的Outlook帐户.这与Exchange非常直接.您只需对具有访问权限的用户进行身份验证,然后您就可以将条目推送到其他用户的帐户.在Office 365中似乎完全不同.
我试着按照这里的说明操作:https: //dev.outlook.com/restapi/getstarted
我创建了应用程序并获得了应用程序的客户端ID.但是,所有文档都围绕着oAuth.一般来说,oAuth是为用户需要通过浏览器窗口输入凭据而设计的,然后通过浏览器窗口向用户确认他们愿意允许应用拥有哪些凭据.
这与我的情况不符.我需要能够在没有任何UI的情况下将日历条目推送到帐户.这是后端集成.它只需要默默地完成它的工作.
我看了这个示例应用程序:https: //github.com/OfficeDev/O365-Win-Snippets
但是,这是一个前端应用程序.当需要进行身份验证时,会弹出一个窗口强制用户输入其凭据.
当我尝试调用入门页面中提到的REST API时,它会返回HTML.这是它提到的网址:
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=&redirect_uri = http%3A%2F%2Flocalhost%2Fmyapp%2F&response_type = code&scope = https%3A%2F%2Foutlook.office.com% 2Fmail.read
我已尝试使用我的客户端ID对此Url进行了一些排列.我尝试通过基本的http身份验证传递我的Office 365凭据.
我被卡住了.
c# ×9
.net ×3
.net-core ×2
usb ×2
uwp ×2
xamarin ×2
android ×1
concurrency ×1
debugging ×1
memorycache ×1
oauth ×1
office365 ×1
qemu ×1
reactiveui ×1
sorting ×1
sqlite ×1
windows ×1
winusb ×1
wpf ×1
xamarin.ios ×1