小编Mel*_*per的帖子

.NET Standard,.Net Core,PCL

所有关于.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标准库.

.net c# xamarin .net-core

42
推荐指数
3
解决办法
8507
查看次数

在 Entity Framework Core 中禁用延迟加载

有很多关于如何在 Entity Framework 中禁用延迟加载的帖子,但相同的技术在 EF Core 中不起作用。我LazyLoadingEnabled在更改跟踪器中找到了该属性,但这似乎根本不起作用。

EF 中的一切都指向了这一点:

this.Configuration.LazyLoadingEnabled = false;
Run Code Online (Sandbox Code Playgroud)

但是,ConfigurationEF 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)

c# sqlite entity-framework .net-core

11
推荐指数
1
解决办法
2万
查看次数

无法在UWP中调试.NET Standard 2.0 DLL

我创建了一个新的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一次又一次地清理文件夹以确保重建正在进行.我也尝试从头开始创建项目并重新添加所有文件.再次,它编译并运行,但不调试.

我可以尝试哪些方法来调试工作?

c# debugging xamarin xamarin.forms uwp

7
推荐指数
1
解决办法
1795
查看次数

Android 模拟器 USB 直通无法连接

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 …

windows usb android qemu android-studio

7
推荐指数
0
解决办法
2220
查看次数

UWP App无法启动

我有一个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]发布的。

我做错什么了?

c# visual-studio windows-store uwp

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

Xamarin Forms - CollectionViewSource 的等价物

在 WPF 和其他基于 XAML 的技术中,有一个名为 CollectionViewSource 的类。它很有用,因为不是过滤和排序内联等,而是在实际集合的顶部放置一个层,并且只将排序/过滤的视图暴露给 UI。这意味着模型将保持干净,而 UI 可以排序或过滤。Xamarin Forms 中是否有等效项?

List<> 类有一个完美的排序方法。但是,List<> 没有实现 INotifyCollectionChanged。是否有实现 INotifyCollectionChanged 和 Sort 方法的 List?

c# sorting wpf xamarin.ios xamarin.forms

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

C#WinUSB无法在接口上调用CloseHandle

我试图用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)

c# usb winusb safefilehandle

6
推荐指数
2
解决办法
322
查看次数

如何分离 IObservable 和 IObserver

更新:查看底部的示例

我需要在课间发消息。发布者将无限循环,调用一些方法来获取数据,然后将该调用的结果传递给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

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

在 MemoryCache 调用上停止重入

应用程序需要加载数据并缓存一段时间。我希望如果应用程序的多个部分想要同时访问同一个缓存键,缓存应该足够智能,只加载一次数据并将该调用的结果返回给所有调用者。然而,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)

.net c# concurrency memorycache concurrentdictionary

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

在没有UI的情况下使用Office 365 REST API

我需要将日历条目推送到客户端的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凭据.

我被卡住了.

.net c# oauth office365

5
推荐指数
1
解决办法
5792
查看次数