小编Dav*_*Yaw的帖子

如何反序列化JSON数据?

我是使用JSON数据的新手.

我正在从Web服务中读取数据.发回的查询数据如下:

[["B02001_001E","NAME","state"],
 ["4712651","Alabama","01"],
 ["691189","Alaska","02"],
 ["6246816","Arizona","04"],
 ["18511620","Florida","12"],
 ["9468815","Georgia","13"],
 ["1333591","Hawaii","15"],
 ["1526797","Idaho","16"],
 ["3762322","Puerto Rico","72"]]
Run Code Online (Sandbox Code Playgroud)

有没有办法以这样的方式反序列化这些数据,即在没有我首先定义对象是什么的情况下生成基础对象?在上面的示例中,对象由第一行定义:

           ["B02001_001E","NAME","state"],
Run Code Online (Sandbox Code Playgroud)

通常,Web服务将返回格式化为二维JSON数组的查询数据,其中第一行提供列名,后续行提供数据值.

c# json json.net windows-phone-8 json-deserialization

29
推荐指数
2
解决办法
10万
查看次数

如何使用PrivateObject访问我的类及其父级的私有成员?

我正在测试一个属于层次结构的类.我一直在用测试对象设置我的测试类,并且PrivateObject允许访问该对象.当我尝试访问父类的私有成员时,我遇到异常.

到目前为止,我发现的唯一解决方法是将PrivateType指定基类传递给PrivateObject构造函数,但是它不适用于子类的私有成员.

有没有办法可以做到这一点,也许是通过在Private对象的Get*方法上使用绑定flags参数?

我尝试使用自动生成的Accessor类(右键单击主类,Create Private Accessor).然而,情况更糟:它显示了我可以读取的属性,但它抛出与PrivateObject相同的异常,并且没有其他选项可以使用(绑定标志或诸如此类)来修复异常.

这是我的示例测试代码.我希望有一些方法来构造和使用PrivateObject来检索这两个字段.

public class BaseClass
{
    private int one = 1;
}

public class SubClass : BaseClass
{
    private int two = 2;
}

[TestClass]
public class UnitTest1
{
    BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;

    [TestMethod]
    public void TestMethod1()
    {
        SubClass test = new SubClass();
        PrivateObject priv = new PrivateObject(test);

        Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.SubClass.one' not found.
        Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags));
    }

    [TestMethod]
    public …
Run Code Online (Sandbox Code Playgroud)

c# unit-testing mstest

24
推荐指数
2
解决办法
4万
查看次数

如何从C++程序执行命令行命令

如何在c ++中执行命令行"asterisk -rx"reload""?请帮忙.我需要一个例子.我正在使用ubuntu服务器,我想从用户(在webservice内)执行此命令行.

需要帮助欣赏

c++ ubuntu

24
推荐指数
2
解决办法
7万
查看次数

MSTest期间终结器中的NullReferenceException

(我知道,这是一个非常漫长的问题.到目前为止,我试图将问题与我的调查分开,所以阅读起来会稍微容易一点.)

我正在使用MSTest.exe运行我的单元测试.偶尔,我看到这个测试错误:

在单个单元测试方法上:"在测试运行时代理进程已停止."

在整个测试运行中:

One of the background threads threw exception: 
System.NullReferenceException: Object reference not set to an instance of an object.
   at System.Runtime.InteropServices.Marshal.ReleaseComObject(Object o)
   at System.Management.Instrumentation.MetaDataInfo.Dispose()
   at System.Management.Instrumentation.MetaDataInfo.Finalize()

所以,这就是我认为我需要做的事情:我需要追踪导致MetaDataInfo错误的原因,但我正在画一个空白.我的单元测试套件需要半个多小时才能运行,并且每次都不会发生错误,所以很难让它重现.

有没有人在运行单元测试中看到过这种类型的故障?您是否能够将其追踪到特定组件?

编辑:

被测代码是C#,C++/CLI和一些非托管C++代码的混合体.非托管C++仅用于C++/CLI,而不是直接来自单元测试.单元测试都是C#.

正在测试的代码将在独立的Windows服务中运行,因此没有来自ASP.net或类似的任何复杂功能.在测试代​​码中,有线程启动和停止,网络通信和文件I/O到本地硬盘驱动器.


我到目前为止的调查:

我花了一些时间在Windows 7机器上挖掘System.Management程序集的多个版本,我在System.Management中找到了MetaDataInfo类,它位于我的Windows目录中.(Program Files\Reference Assemblies下的版本要小得多,并且没有MetaDataInfo类.)

使用Reflector检查这个程序集,我发现MetaDataInfo.Dispose()中似乎是一个明显的错误:

// From class System.Management.Instrumentation.MetaDataInfo:
public void Dispose()
{
    if (this.importInterface == null) // <---- Should be "!="
    {
        Marshal.ReleaseComObject(this.importInterface);
    }
    this.importInterface = null;
    GC.SuppressFinalize(this);
}
Run Code Online (Sandbox Code Playgroud)

有了这个'if'语句,如果存在,MetaDataInfo将泄漏COM对象,否则抛出NullReferenceException.我在Microsoft Connect上报告了此问题:https://connect.microsoft.com/VisualStudio/feedback/details/779328/

使用反射器,我能够找到MetaDataInfo类的所有用途.(这是一个内部类,所以只搜索程序集应该是一个完整的列表.)它只使用了一个地方:

public static Guid GetMvid(Assembly assembly)
{
    using (MetaDataInfo info …
Run Code Online (Sandbox Code Playgroud)

.net c# mstest system.management

20
推荐指数
1
解决办法
1653
查看次数

尝试在新的AppDomain中加载混合的C#和C++/CLI dll时从错误的AppplicationBase加载的DLL

我们有一个大型的.NET解决方案,其中包含相互引用的C#和C++/CLI项目.我们还有几个单元测试项目.我们最近从Visual Studio 2010和.NET 4.0升级到Visual Studio 4.5和.NET 4.5,现在当我们尝试运行单元测试时,在测试期间加载某些DLL似乎存在问题.

问题似乎发生,因为单元测试是在单独的AppDomain上执行的.单元测试过程(例如nunit-agent.exe)创建一个新的AppDomain,AppBase设置为测试项目的位置,但是根据Fusion Log,一些DLL加载了nunit的可执行文件目录作为AppBase而不是AppDomain的AppBase .

我设法用一个更简单的场景重现问题,它创建了一个新的AppDomain并尝试在那里运行测试.这是它的外观(我更改了单元测试类的名称,方法和dll的位置以保护无辜者):

class Program
{
    static void Main(string[] args)
    {

        var setup = new AppDomainSetup {
            ApplicationBase = "C:\\DirectoryOfMyUnitTestDll\\"
        };

        AppDomain domain = AppDomain.CreateDomain("MyDomain", null, setup);
        ObjectHandle handle = Activator.CreateInstanceFrom(domain, typeof(TestRunner).Assembly.CodeBase, typeof(TestRunner).FullName);
        TestRunner runner = (TestRunner)handle.Unwrap();
        runner.Run();

        AppDomain.Unload(domain);
    }

}

public class TestRunner : MarshalByRefObject
{
    public void Run()
    {
        try
        {
            HtmlTransformerUnitTest test = new HtmlTransformerUnitTest();
            test.SetUp();
            test.Transform_HttpEquiv_Refresh_Timeout();
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我尝试执行单元测试时遇到的异常.正如您所看到的,问题发生在C++ dll初始化并尝试加载C#dll(我将所涉及的DLL的名称更改为CPlusPlusDll和CSharpDll):

System.TypeInitializationException: …

c# unit-testing c++-cli appdomain .net-4.5

17
推荐指数
1
解决办法
3143
查看次数

使用指令在C++/CLI中指定类别名

在C#中,有三种使用指令:

using System; // Specify Namespace
using Diag = System.Diagnostics; // Specify Namespace Alias
using DBG = System.Diagnostics.Debug;  // Specify Class Alias
Run Code Online (Sandbox Code Playgroud)

在C++/CLI中,我知道前两个的等价物:

using namespace System;
namespace Diag = System::Diagnostics;
Run Code Online (Sandbox Code Playgroud)

有没有办法在C++/CLI中做第三个?

做的namespace DBG = System::Diagnostics::Debug;error C2879: 'System::Diagnostics::Debug' : only an existing namespace can be given an alternative name by a namespace alias definition

我提出的唯一的交替是#define DBG System::Diagnostics::Debug,但我更喜欢正确的使用指令,如果可用的话.

c++-cli using-directives

15
推荐指数
1
解决办法
4638
查看次数

工会内无名的联盟

我正在阅读一些代码,发现如下内容:

typedef union {
    int int32;
    int boolean;
    time_t date;
    char *string;
    union {
        struct foo *a;
        struct foo *b;
        struct foo *c;
    };
} type_t;
Run Code Online (Sandbox Code Playgroud)

从语法的角度来看,内部联合{}可以被移除并且在外部联合{}内直接具有*a,*b和*c.那无名嵌入式联盟的目的是什么?

c unions

12
推荐指数
3
解决办法
720
查看次数

C# 杀死所有对运行 Windows 不重要的进程

我有一个申请。如果该应用程序在 15 分钟内未使用,则需要关闭所有其他应用程序(强制关闭)并且计时器再次启动。我不想这样做让 Windows 7 崩溃。到目前为止我有以下内容:

Process me = Process.GetCurrentProcess();
foreach (Process p in Process.GetProcesses())
{
    if (p.Id != me.Id 
        && p.ProcessName != "winlogon.exe" 
        && p.ProcessName != "explorer.exe"
        && p.ProcessName != "System Idle Process"
        && p.ProcessName != "taskmgr.exe"
        && p.ProcessName != "spoolsv.exe"
        && p.ProcessName != "csrss.exe"
        && p.ProcessName != "smss.exe"
        && p.ProcessName != "svchost.exe "
        && p.ProcessName != "services.exe"
    )
    {
        p.Kill();
    }
}
Run Code Online (Sandbox Code Playgroud)

遗憾的是 Windows 死机了(蓝屏)。有什么方法可以关闭所有正在使用的进程,然后希望 Windows 能够生存下来。

c# windows-7 dangerous-request

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

SSL证书链有所不同;如何验证?

简短版本:根据我访问https服务器的方式,我看到的SSL证书链有所不同。这是怎么回事,在这种情况下如何验证证书?


版本稍长:

我正在尝试使用libcurl来验证SSL连接的证书。我要连接的服务器是Amazon S3。

当我在Firefox中访问Amazon S3时,将获得以下证书链:

  • VeriSign 3类公共一级证书颁发机构-G5
    序列号:18:DA:D1:9E:26:7D:E8:BB:4A:21:58:CD:CC:6B:3B:4A
    • VeriSign 3类安全服务器CA-G3
      序列号:6E:CC:7A:A5:A7:03:20:09:B8:CE:BC:F4:E9:52:D4:91
      • * .s3.amazonaws.com
        序列号:43:FB:BA:C2:66:27:E0:97:1E:1C:11:E0:30:C3:6B:66

当我通过OpenSSL命令行工具访问相同的URL时,将获得以下证书链:

  1. * .s3.amazonaws.com
    序列号:43fbbac26627e0971e1c11e030c36b66
  2. VeriSign 3类安全服务器CA-G3
    序列号:6ecc7aa5a7032009b8cebcf4e952d491
  3. VeriSign 3类公共一级证书颁发机构-G5
    序列号:35973187f3873a07327ece580c9b7eda

“ * .s3.amazonaws.com”和“ VeriSign 3类安全服务器CA-G3”证书似乎是相同的,但此后的证书是不同的!两个链中都将其命名为“ VeriSign 3类公共主要证书颁发机构-G5”,但是证书序列号不同。(其他信息也不同;如果需要更长的转储,请告诉我。)

我相信这种差异是我无法获取libcurl来验证SSL证书的原因。序列号为“ 18:DA:D1 ...”的证书在我的CACERT.PEM文件中,而序列号为“ 35:97:31 ...”的证书不在。

显然,简单的解决方法是将证书“ 35:97:31 ...”添加到我的CACERT.PEM文件中,但我想在此处进行正确的更改,而不仅仅是快速修复。

  • 证书链中的差异意味着什么?
  • SSL服务器甚至可能根据客户端返回不同的证书链(Firefox与OpenSSL / libcurl)?
  • 我应该如何获得libcurl来验证此SSL证书?

真正的长版和背景信息:

我正在使用带有OpenSSL的libcurl从Amazon S3下载。Libcurl返回“ SSL证书问题:无法获取本地发行者证书”,这意味着我的CACERT.PEM文件中未列出根证书。(我使用的是从curl的网站下载的文件,该文件是从Mozilla的证书存储转换而来的。)我能够验证其他SSL连接上的证书,因此我知道我的libcurl设置正确。

为了查看发生了什么以及为什么证书没有通过验证,我在Firefox中提取了相同的URL。Firefox没有显示任何SSL证书警告。这是Firefox显示的认证路径。我的CACERT.PEM文件中列出了根证书“ VeriSign 3类公共主要证书颁发机构-G5”,并且证书的序列号与屏幕快照中显示的序列号匹配。

Firefox屏幕截图

这是链中所有三个证书的序列号:

  • VeriSign 3类公共一级证书颁发机构-G5
    序列号:18:DA:D1:9E:26:7D:E8:BB:4A:21:58:CD:CC:6B:3B:4A
    • VeriSign 3类安全服务器CA-G3
      序列号:6E:CC:7A:A5:A7:03:20:09:B8:CE:BC:F4:E9:52:D4:91
      • * .s3.amazonaws.com
        序列号:43:FB:BA:C2:66:27:E0:97:1E:1C:11:E0:30:C3:6B:66

在不同的平台(不同的操作系统,不同版本的OpenSSL等)上,我尝试使用OpenSSL命令行工具访问相同的URL,并且获得了不同的认证路径!

$ openssl s_client -showcerts -connect stackoverflowtest.s3.amazonaws.com:443
已连接(00000003)
depth = 3 C =美国,O =“ VeriSign,Inc。”,OU …

ssl libcurl ssl-certificate

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

如何动态获取文本框中datagridview列的总和

我想得到一列datagridview的总和,并在文本框中显示.每次输入后,应动态更改总和.为此,我使用文本框的textChanged事件但是当输入时,它不显示任何结果.我想在文本框中动态获取结果.我想避免使用按钮来求和.

这是textbox textChanged事件的一段代码:

private void textBox9_TextChanged(object sender, EventArgs e)
        {
            double sum = 0;
            for (int i = 0; i < dataGridView2.Rows.Count; ++i)
            {
                sum += Convert.ToDouble(dataGridView2.Rows[i].Cells[5].Value);
            }
            textBox9.Text = sum.ToString();
        }
Run Code Online (Sandbox Code Playgroud)

c# textbox datagridview winforms textchanged

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