我正在寻找一些库来从Jpg文件读取/写入IPTC元数据.开源或付费,没关系.
它应该适用于.NET 3.5和c#.
有人知道这样的图书馆吗?我用Google搜索但没有找到任何东西.
我必须从SQL Server旋转给定的表,但正常的枢轴不起作用(据我所知).那么有人知道如何将表格旋转成所需的格式吗?
只是为了使问题更复杂,给定标签的列表可能会有所不同,并且可能会在任何给定时间出现新的标签名称.
ID |  Label          |  Numerator  |  Denominator  |  Ratio 
---+-----------------+-------------+---------------+--------
1  |  LabelNameOne   |  41         |  10           |  4,1   
1  |  LabelNameTwo   |  0          |  0            |  0     
1  |  LabelNameThree |  21         |  10           |  2,1   
1  |  LabelNameFour  |  15         |  10           |  1,5   
2  |  LabelNameOne   |  19         |  19           |  1     
2  |  LabelNameTwo   |  0          |  0            |  0     
2  |  LabelNameThree |  15         |  16           |  0,9375
2  |  LabelNameFive …为了解释这个问题,我把所需的一切都放在一个小样本应用程序中,希望能够解释这个问题 我真的试图尽可能减少所有内容,但在我的实际应用中,这些不同的演员彼此不认识,也不应该.因此,简单的回答,如"将变量放在上面的几行并调用它上面的Invoke"是行不通的.
让我们从代码开始,然后再解释一下.首先有一个实现INotifyPropertyChanged的简单类:
public class MyData : INotifyPropertyChanged
{
    private string _MyText;
    public MyData()
    {
        _MyText = "Initial";
    }
    public string MyText
    {
        get { return _MyText; }
        set
        {
            _MyText = value;
            PropertyChanged(this, new PropertyChangedEventArgs("MyText"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
所以没什么特别的.这里的示例代码可以简单地放入任何空的控制台应用程序项目中:
static void Main(string[] args)
{
    // Initialize the data and bindingSource
    var myData = new MyData();
    var bindingSource = new BindingSource();
    bindingSource.DataSource = myData;
    // Initialize the form and the controls of it ...
    var form …我只是通过使用扩展方法回答了一个非常简单的问题.但在写完之后我记得你不能从事件处理程序取消订阅lambda.
到目前为止没有大问题.但是这一切如何在扩展方法中表现出来?
下面是我的代码再次剪断.所以任何人都可以启发我,如果你多次调用这个扩展方法会导致无数的计时器在内存中徘徊?
我会说不,因为定时器的范围在这个函数内是有限的.所以在离开后没有其他人有这个对象的引用.我只是有点不确定,因为我们在静态类中的静态函数中.
public static class LabelExtensions
{
    public static Label BlinkText(this Label label, int duration)
    {
        System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
        timer.Interval = duration;
        timer.Tick += (sender, e) =>
            {
                timer.Stop();
                label.Font = new Font(label.Font, label.Font.Style ^ FontStyle.Bold);
            };
        label.Font = new Font(label.Font, label.Font.Style | FontStyle.Bold);
        timer.Start();
        return label;
    }
}
只是为了澄清我使用的是System.Windows.Forms.Timer.所以从您的答案看来,特别是使用这个计时器类只是正确的选择因为它做了任何事情,就像我在这种情况下所期望的那样.如果你在这种情况下尝试另一个计时器类,你可能会遇到麻烦,正如马修发现的那样.此外,我发现了一种方法,通过使用了WeakReference ■如果我的对象是活着还是没有.
经过一点点的睡眠和更多的思考后,我还对我的测试仪做了另一个改动(下面回答)我刚刚GC.Collect()在最后一行之后添加了一个并将持续时间设置为10000.启动BlinkText()几次之后我一直按下我的按钮2到获取当前状态并强制进行垃圾回收.而且看起来所有的计时器都会在调用Stop()方法后被销毁.因此,当我的BlinkText已经离开并且计时器正在运行时,垃圾收集也不会导致任何问题.
因此,经过你所有的良好反应和更多的测试后,我可以高兴地说,它只是做了它应该做的事情而不会将计时器留在记忆中,也不会在计时器完成工作之前扔掉它们.
目前,我正在尝试为我们的解决方案设置一个新管道,但无法让 Visual Studio 测试在我的解决方案中找到正确的测试集。它要么选择一个不包含任何测试的 DLL(这会导致任务失败),要么如果我指定了该testAssemblyVer2属性,它会产生一个警告,提示它找不到任何要测试的程序集。
我们正在使用的基本任务配置:
- task: VSTest@2
  inputs:
    platform: '$(buildPlatform)'
    configuration: '$(buildConfiguration)'
    searchFolder: '$(System.DefaultWorkingDirectory)'
    runInParallel: true
    codeCoverageEnabled: true
    diagnosticsEnabled: true
如果我们运行它,我们可以在输出中看到以下配置(部分):
 ...
 Test assemblies : **\*test*.dll,!**\*TestAdapter.dll,!**\obj\**
 ...
 ======================================================
 [command]"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\Extensions\TestPlatform\vstest.console.exe" @d:\a\_temp\66884a11-77b3-11e9-b7cb-25533524cce5.txt
 Microsoft (R) Test Execution Command Line Tool Version 16.0.1
 Copyright (c) Microsoft Corporation.  All rights reserved.
 "d:\a\1\s\Tests\Api\FirstController.Tests\bin\Release\netcoreapp2.1\FirstController.Tests.dll"
 "d:\a\1\s\Tests\Api\SecondController.Tests\bin\Release\netcoreapp2.1\SecondController.Tests.dll"
 "d:\a\1\s\Tests\CreateTranslateStringsFromDeviceConfigurationSettings\bin\Release\netcoreapp2.1\CreateTranslateStringsFromDeviceConfigurationSettings.dll"
 "d:\a\1\s\Tests\Api\FourthController.Tests\bin\Release\netcoreapp2.1\FourthController.Tests.dll"
 "d:\a\1\s\Tests\Api\FifthController.Tests\bin\Release\netcoreapp2.1\FifthController.Tests.dll"
 /Settings:"d:\a\_temp\69a604d0-77b3-11e9-b7cb-25533524cce5.runsettings"
 /EnableCodeCoverage
 /logger:"trx"
 /TestAdapterPath:"d:\a\1\s"
 Starting test execution, please wait...
如您所见,有一个程序集CreateTranslateStringsFromDeviceConfigurationSettings不包含任何测试,但被选为测试的候选对象。我从我的具体解决方案中取了确切的原始名称,只是为了表明它显然与模式不匹配但被选中。现在我们尝试通过定义我们自己的匹配模式来避免这个问题。
如果我们通过助手创建任务,它会默认添加以下值:
    testAssemblyVer2: '**\*test*.dll
      !**\*TestAdapter.dll
      !**\obj\**'
如果我们运行它,我们会得到以下输出:
...
 Test assemblies …我有一堆项目的解决方案,所有项目都在 .Net Standard 2.0 或 .Net Core 2.2 上运行。同样由于历史原因,所有项目文件中的语言版本都被定义为<LangVersion>latest<LangVersion>. 由于最近的 Visual Studio 更新之一(目前我在 16.3.7),.Net Core 3.0 和 C# 8 也可用。到现在为止还挺好。
然后随着时间的推移,我实现了一些基于 EF 核心的功能(但在这种情况下无关紧要)并编写了以下代码(或多或少):
var entity = _context.SomeEntities
    .Where(entity => entity.Id == id)
    .FirstOrDefault();
它编译没有任何问题!错误信息在哪里A local or parameter named 'item' cannot be declared in this scope because that name is used in an enclosing local scope to define a local or parameter?
即使下面的代码编译也没有任何错误:
var items = Enumerable.Range(1, 10);
var item = 2;
Console.WriteLine(item);
item = items.FirstOrDefault(item => …这是我写的测试,目前将失败:
var unusableColor = Color.FromArgb(13, 19, 20, 19);
var retrievedColor = Color.Empty;
var tempFile = Path.GetTempFileName();
using (var bitmap = new Bitmap(1, 1))
{
    bitmap.SetPixel(0, 0, unusableColor);
    bitmap.Save(tempFile, ImageFormat.Png);
}
using (var image = Image.FromFile(tempFile))
// This will lead to the error
using (var bitmap = new Bitmap(image))
// But this will work
//using (var bitmap = (Bitmap)image)
{
    retrievedColor = bitmap.GetPixel(0, 0);
}
Assert.That(retrievedColor, Is.SameAs(unusableColor));
如果你看看retrievedColor你会发现它将是相同的Color.FromArgb(13, 19, 19, 19).所以区别在于绿色部分从20变为19.
知道为什么会发生这种情况或者在什么情况下Bitmap的构造函数会改变一个像素?
似乎是一个更深层次的嵌套问题.通过Bitmap图像变量的简单转换替换构造函数,问题就消失了.这可能解决了这个问题,但并没有解释它.通过以下过程,我甚至可以在Paint.Net中重现问题:
我们有一个面向目标的项目,netstandard2.0该项目使用 NuGet 包CsvHelper,该包也可作为netstandard2.0.
该项目包含CsvConfiguration构建为的类:
public class CsvConfiguration
{
    public virtual string Delimiter { get; init; }
}
我们过去使用这个库没有任何问题。将 Visual Studio 从 16.8.6 更新到 16.9.0 后,生成时出现上述错误消息:
error CS8370: Feature 'init-only setters' is not available in C# 7.3. Please use language version 9.0 or greater.
虽然我理解为什么会发生此错误,但如果我在自己的代码中使用此功能,我不知道如果第三方库使用它(声明为与我的框架版本匹配)为什么会发生这种情况。
这是库中还是 Visual Studio 中的错误?因为在 VS 16.8.6 中它编译得很好,而在 VS 16.9.0 中它失败了。
我知道,一个简单的解决方法是<LangVersion>在我们的 .csproj 文件中添加一个条目,但这是推荐的方法吗?
我正在c#中创建一个Windows窗体应用程序,它将在Windows启动时启动.用户还可以从桌面上的图标启动应用程序.我希望应用程序在系统托盘中最小化,如果它是从Windows启动启动的,并且如果用户点击其快捷图标启动,则处于正常的窗口状态.有没有办法检测应用程序是由用户启动还是启动?
我正在使用此代码使应用程序在启动时出现
regesiterykey.SetValue("MyApp", Application.ExecutablePath.ToString());