小编dav*_*ick的帖子

Visual Studio 2010调试器中的上下文变量

对于面向.NET 4.0的C#控制台应用程序,Visual Studio 2010调试器中的局部变量脱离上下文,我遇到了一个非常奇怪的问题.我在SO上搜索过其他类似的问题,但有些问题有相同的症状,似乎没有一个直接适用于这个问题(它们似乎都有其他根本原因).

问题是,对于某些变量(但不是全部),我没有得到带有它们值的工具提示,它们没有出现在Locals窗口中,并且我得到"当前上下文中不存在名称'xyz'"如果我将它们添加到Watch窗口.它似乎影响了一些变量而不影响其他变量,我无法弄清楚一个模式(它似乎不是基于成员与本地,类与结构或任何其他区别).我已经重新启动了我的计算机和Visual Studio,验证了我是一个干净的Debug版本,确保调试框架是正确的,确保刷新监视屏幕中的变量,并尝试各种法术和咒语.

我在下面添加了一个屏幕截图(http://i.stack.imgur.com/JTFBT.png上的更大版本).

在此输入图像描述

有什么想法吗?

编辑:

添加一些其他信息:

问题是可重复的.即使在完全关闭并重新启动Visual Studio之后,完全相同的变量也可以工作或不起作用.这让我相信实际上存在系统性错误,而不仅仅是内存损坏或其他问题.

我还发现它似乎与try-catch块有关.如果我将断点放在try语句之外,我可以正常看到任何范围内的变量.一旦执行点进入try语句,try块之外的所有变量都将变得不可访问,我只能访问try语句中的变量.这几乎就像调试器将try块视为一个单独的方法一样(尽管你可以看到代码/编译器仍然可以访问范围内的变量).以前有人见过这种行为吗?

另一个编辑:

我(部分)收回了我所说的关于try-catch被怀疑的内容 - 似乎在代码的这一部分中,调试器展示了这个奇怪的东西在任何封闭块的上下文之外.例如,如果我在屏幕截图中的foreach语句中直接设置断点,我可以在每次迭代时看到"port"变量值,但是在foreach语句之外没有变量(一旦我进入foreach块就会消失) .然后,只要您进入try块,"port"变量就会突然消失.这变得非常奇怪.

此外,根据要求,整个方法的代码如下.

private void ConfigureAnnouncerSockets(XDocument configDocument)
{
    XElement socketsElement = configDocument.XPathSelectElement("/Configuration/Network/AnnouncerSockets");
    bool useDefault = true;
    if (socketsElement != null)
    {
        //Use the default announcers? (they will be added at the end)
        XAttribute defaultAttribute = socketsElement.Attribute("useDefault");
        if (defaultAttribute != null)
        {
            useDefault = Convert.ToBoolean(defaultAttribute);
        }

        //Get the default frequency
        int defaultFrequency = Announcer.DefaultFrequency;
        XAttribute frequencyAttribute = socketsElement.Attribute("frequency");
        if (frequencyAttribute != null)
        { …
Run Code Online (Sandbox Code Playgroud)

c# debugging visual-studio-2010 visual-studio

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

使用XmlSerializer反序列化List <int>导致额外的项目

我注意到XmlSerializer和通用列表(特别是List<int>)的奇怪行为.我想知道是否有人以前见过这个或知道发生了什么.看起来好像序列化工作正常但反序列化想要在列表中添加额外的项目.下面的代码演示了这个问题.

可序列化类:

public class ListTest
{
    public int[] Array { get; set; }
    public List<int> List { get; set; }

    public ListTest()
    {
        Array = new[] {1, 2, 3, 4};
        List = new List<int>(Array);
    }
}
Run Code Online (Sandbox Code Playgroud)

测试代码:

ListTest listTest = new ListTest();
Debug.WriteLine("Initial Array: {0}", (object)String.Join(", ", listTest.Array));
Debug.WriteLine("Initial List: {0}", (object)String.Join(", ", listTest.List));

XmlSerializer serializer = new XmlSerializer(typeof(ListTest));
StringBuilder xml = new StringBuilder();
using(TextWriter writer = new StringWriter(xml))
{
    serializer.Serialize(writer, listTest);
}

Debug.WriteLine("XML: {0}", (object)xml.ToString());

using(TextReader reader …
Run Code Online (Sandbox Code Playgroud)

.net c# serialization xmlserializer

12
推荐指数
1
解决办法
4507
查看次数

在Nullable Floats上添加时的好奇行为

在添加可空浮动时,我注意到了一些非常奇怪的东西.请使用以下代码:

float? a = 2.1f;
float? b = 3.8f;
float? c = 0.2f;
float? result = 
(a == null ? 0 : a)
+ (b == null ? 0 : b)
+ (c == null ? 0 : c);
float? result2 = 
(a == null ? 0 : a.Value)
+ (b == null ? 0 : b.Value)
+ (c == null ? 0 : c.Value);
Run Code Online (Sandbox Code Playgroud)

result6.099999result26.1.我很幸运,有过一次,因为如果我改变值这个跌跌撞撞a,bc行为通常显示正确.其他算术运算符或其他可空值类型也可能发生这种情况,但这是我能够重现的情况.我不明白的是,为什么隐式转换为float …

c#

12
推荐指数
1
解决办法
230
查看次数

寻找包描述语言(最好使用AC#实现)

我正在开发一个具有一些数据包嗅探和解码功能的专用网络工具.我正在寻找旨在帮助解剖/解码任意数据包格式的语言.理想情况下,解决方案应基于开放标准.有关于SO的相关问题,但大多数涉及数据包嗅探的整个生命周期(我不太关心捕获,还有其他库可以做到这一点).

一般来说,我正在寻找的是一种语言和支持框架,用于分组格式的明确定义和相应的运行时解码.因为这个问题可以推广到任何非网络二进制数据,所以对任意二进制流执行此操作的解决方案也将在范围内.我有点惊讶,目前在成熟和稳健的状态下没有这样的标准(至少我能找到) - 虽然似乎有很多有趣但不完全正确且几乎有项目(见下文).也许这说明了问题的困难,或者可能是缺乏需求.

举例来说,我对类似于以下的技术和想法感兴趣(没有特别的顺序):

  • Packet.Net - 从二进制数据包表示转换到结构的工作,但解剖器都是硬编码的,它似乎不能处理更复杂的格式.
  • DFDL - 我一直在关注这个问题,甚至在大约一年前参加电话会议.该标准似乎已达到成熟,但实施似乎具有挑战性.我并不介意弄脏自己的手,但我不确定我是否已经获得了这个项目的资源,为此目的从头开始实施这样一个广泛的标准.
  • 网络监视器开源分析程序 - 此项目使用类似C语法的数据包描述Microsoft网络监视器使用的数据包.它已经定义了很多数据包,语言看起来足够强大,可以支持复杂的结构.不幸的是,执行引擎的唯一实现是在NetMon中,虽然语言的语法可能是逆向工程的,但实现处理引擎可能非常困难.我还担心,由于解析器语言和NetMon工具之间的明确联系,语言的非一般方面会使其不适合在其他工具中使用.
  • NetPDL - 这个看起来非常有趣,但发展似乎已经衰落.如何在自己的环境之外使用执行引擎也不是很清楚.
  • Wireshark Dissectors - 我考虑过为此目的包装/使用原生Wireshark Dissector,但它们与Wireshark本身紧密相关.解剖器也使用代码来执行大部分解码,这与我正在寻找的东西有点相反 - 我更喜欢一些更具说明性的东西(尽管显然存在平衡,因为复杂的数据包结构通常需要切换和其他确定最终化妆的逻辑).
  • BSDL - 与DFDL概念相似的学术语言(见上文).有趣且方向正确,但在几篇论文之外似乎没有别的东西存在.

我不一定在这里寻找一个完整的解决方案(虽然如果有人知道我没有涉及的那个,那就太好了).我对我上面提到的技术的评论或轶事更感兴趣,以及我没有想到或涵盖的路线的指针或想法.

c# networking parsing packet

9
推荐指数
1
解决办法
1560
查看次数

在C#中使用任意位位置和长度提取字节边界的值

我目前正在研究一种网络工具,它需要对特定协议进行解码/编码,该协议将字段打包到任意位置的密集位数组中.例如,协议的一部分使用3个字节来表示许多不同的字段:

Bit Position(s)  Length (In Bits)    Type
0                1                   bool
1-5              5                   int
6-13             8                   int
14-22            9                   uint
23               1                   bool
Run Code Online (Sandbox Code Playgroud)

如您所见,其中一些字段跨越多个字节.许多(大多数)也比可能用于表示它们的内置类型短,例如第一个只有5位长的int字段.在这些情况下,目标类型的最高有效位(例如Int32或Int16)应填充为0以弥补差异.

我的问题是我很难处理这类数据.具体来说,我很难弄清楚如何有效地获取任意长度的位数组,用源缓冲区中的相应位填充它们,填充它们以匹配目标类型,并将填充的位数组转换为目标类型.在理想的世界中,我可以在上面的例子中使用字节[3]并调用类似的方法GetInt32(byte[] bytes, int startBit, int length).

我发现的最接近的东西是BitStream类,但它似乎希望单个值在字节/字边界上排列(并且类的半流/半索引访问约定使它变得有点混乱).

我自己的第一次尝试是使用BitArray类,但事实证明这有点笨拙.很容易将缓冲区中的所有位填充到一个大的BitArray,只将你想要的从源BitArray传输到一个新的临时BitArray,然后将其转换为目标值...但它似乎是错误的,而且非常耗时.

我现在正在考虑一个类如下的类,它引用(或创建)源/目标byte []缓冲区以及偏移量,并为某些目标类型提供get和set方法.棘手的部分是获取/设置值可能跨越多个字节.

class BitField
{
    private readonly byte[] _bytes;
    private readonly int _offset;

    public BitField(byte[] bytes)
        : this(bytes, 0)
    {
    }

    public BitField(byte[] bytes, int offset)
    {
        _bytes = bytes;
        _offset = offset;
    }

    public BitField(int size) …
Run Code Online (Sandbox Code Playgroud)

c# binary networking bit-manipulation

9
推荐指数
1
解决办法
3366
查看次数

如何并行执行嵌套的异步/等待代码,同时在等待延续上保持相同的线程?

这可能是我写过的最糟糕的StackOverflow标题.我实际上要做的是执行一个异步方法,该方法在同步方法中多次并行使用async/await约定(并且本身包含额外的await调用),同时在整个执行每个分支的过程中保持相同的线程.并行执行,包括所有等待延续.换句话说,我想同步执行一些异步代码,但我想多次并行执行.现在你可以看到为什么标题太糟糕了.也许最好用一些代码来说明......

假设我有以下内容:

public class MyAsyncCode
{
    async Task MethodA()
    {
        // Do some stuff...
        await MethodB();
        // Some other stuff
    }

    async Task MethodB()
    {
        // Do some stuff...
        await MethodC();
        // Some other stuff
    }

    async Task MethodC()
    {
        // Do some stuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

调用者是同步的(来自控制台应用程序).让我尝试说明我尝试使用Task.WaitAll(...)和包装任务的尝试:

public void MyCallingMethod()
{
    List<Task> tasks = new List<Task>();
    for(int c = 0 ; c < 4 ; c++)
    {
        MyAsyncCode asyncCode = new MyAsyncCode();
        tasks.Add(Task.Run(() => asyncCode.MethodA()));
    }
    Task.WaitAll(tasks.ToArray());
} …
Run Code Online (Sandbox Code Playgroud)

c# parallel-processing multithreading asynchronous async-await

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

实体框架中的LINQ预测的可重用计算(代码优先)

我的域模型有很多复杂的财务数据,这是对各种实体的多个属性进行相当复杂计算的结果.我通常将这些作为[NotMapped]属性包含在适当的域模型中(我知道,我知道 - 关于将业务逻辑放在您的实体中存在很多争论 - 务实,它只适用于AutoMapper并让我定义可重用DataAnnotations- 讨论是否这样做是好还是不好不是我的问题.

只要我想实现整个实体(以及任何其他依赖实体,通过.Include()LINQ调用或在实现后通过其他查询),然后在查询后将这些属性映射到视图模型,这样就可以正常工作.当尝试通过投影到视图模型而不是实现整个实体来优化有问题的查询时,会出现问题.

考虑以下域模型(显然简化):

public class Customer
{
 public virtual ICollection<Holding> Holdings { get; private set; }

 [NotMapped]
 public decimal AccountValue
 {
  get { return Holdings.Sum(x => x.Value); }
 }
}

public class Holding
{
 public virtual Stock Stock { get; set; }
 public int Quantity { get; set; }

 [NotMapped]
 public decimal Value
 {
  get { return Quantity * Stock.Price; }
 }
}

public class Stock
{
 public string …
Run Code Online (Sandbox Code Playgroud)

c# linq linq-to-entities entity-framework

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

如何将Roslyn脚本提交用作其他Roslyn编译中的程序集

我想在另一个非脚本编写的Roslyn编译中重用一个脚本作为动态程序集,但我不能为我的生活弄清楚如何使其工作.

例如,假设我以正常方式创建脚本,然后使用以下内容将脚本作为程序集发送到字节流:

var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = script.GetCompilation().WithOptions(compilationOptions);
using (var ms = new MemoryStream())
{
    EmitResult result = compilation.Emit(ms);
    ms.Seek(0, SeekOrigin.Begin);
    assembly = Assembly.Load(ms.ToArray());
}
Run Code Online (Sandbox Code Playgroud)

现在,假设我想将该程序集作为参考提供给另一个非脚本编译.我不能只使用,assembly因为没有一种MetadataReference.CreateFrom...()方法支持传递实际的Assembly实例.作为动态组件,它没有位置,所以我无法使用MetadataReference.CreateFromFile().

在过去,我已经MetadataReference.CreateFromStream()成功地使用了这种类型的东西,但是当程序集代表脚本提交时,这似乎不起作用(我不知道为什么).编译继续进行,但只要您尝试使用提交中的类型,就会出现以下错误:

System.InvalidCastException: [A]Foo cannot be cast to [B]Foo. Type A originates from 'R*19cecf20-a48e-4a31-9b65-4c0163eba857#1-0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' in a byte array. Type B originates from 'R*19cecf20-a48e-4a31-9b65-4c0163eba857#1-0, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' in the context 'LoadNeither' in a byte array.
Run Code Online (Sandbox Code Playgroud)

我猜测它与提交程序集处于不同的上下文时有关,当评估与作为字节数组加载时.我非常喜欢在以后的非脚本编译中使用脚本提交中定义的对象和方法的最佳方法的任何见解或指导. …

.net c# .net-assembly roslyn

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

无法一瞥在远程IIS上工作

我已经尝试了所有我能想到的东西,所以我转向了SO.我无法让Glimpse在远程IIS服务器上工作.我正在使用Glimpse 1.2与ADO,ASP.NET,EF5和Mvc4扩展.当我使用VS开发服务器在本地启动Web应用程序时,一切都运行良好.但是,在部署到我们的远程开发服务器时,似乎无法显示Glimpse图标.这是我尝试过并注意到的:

  • 我忽略了我的LocalPolicy web.config:

    <glimpse defaultRuntimePolicy="On" endpointBaseUri="~/Glimpse.axd">
        <inspectors>
            <ignoredTypes>
                <add type="Glimpse.Mvc.Inspector.DependencyInjectionInspector, Glimpse.Mvc4" />
                <add type="Glimpse.AspNet.Policy.LocalPolicy, Glimpse.AspNet"/>
            </ignoredTypes>
        </inspectors>
    </glimpse>
    
    Run Code Online (Sandbox Code Playgroud)
  • 我可以访问/Glimpse.axd并按下启用按钮而不会出现问题

  • 使用内容设置cookie:

    glimpsePolicy
    On
    backofficetest/
    1088
    2027053056
    32990064
    3189135193
    30291671
    *
    
    Run Code Online (Sandbox Code Playgroud)
  • 打开Glimpse日志不会显示任何错误或警告消息.它为每个请求生成以下内容:

2013-04-11 12:43:06.8992 | DEBUG | RuntimePolicy set to 'Off' by IRuntimePolicy of type 'Glimpse.AspNet.Policy.LocalPolicy' during RuntimeEvent 'BeginRequest'.

  • Fiddler验证在请求期间没有对任何与Glimpse相关的资源进行调用.

  • 页面源中不显示与Glimpse相关的任何内容.

我确定我错过了某个地方的设置,但这让我疯狂.有人有主意吗?

谢谢.

asp.net iis glimpse

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

如何列出NuGet v3 API中的所有本地包

对于上下文,我正在构建一个应用程序,需要从任意包源(默认情况下包括公共库)下载/解压缩包及其依赖项,并在请求时将这些包升级到最新版本.没有project.json文件或类似文件,它都是代码驱动的.它不是一个特别复杂的用例,并且在v2 API中不需要太多代码.

但是在v3中,我无法弄清楚如何正确地与本地包存储进行交互.例如,FolderNuGetProject我想到的类列出了给定位置的磁盘上的所有包,FolderNuGetProject.GetInstalledPackagesAsync() 只返回一个空的可枚举.为了使问题更加混乱,FolderNuGetProject.PackageExists()实际上确实返回磁盘上是否存在包,这意味着GetInstalledPackagesAsync()并且PackageExists()看起来不一致.

其他NuGetProject衍生物都不会与文件系统相关.是否有其他方法列出已安装到特定文件夹中的软件包?如果我需要创建自己的NuGetProject(并且我希望我不这样做),是否有任何方法可以帮助将NuGet生成的文件夹名称解析为包ID和版本,或者是获取ID的唯一可靠方法打开nuspec的版本(有没有容易找到的方法)?

一个解释为什么这不能正常工作的原因是NuGetProject.GetInstalledPackagesAsync()实际上并不是为了获取已安装的软件包(即已经下载和解压缩的软件包),而是那些已经被声明的软件包项目系统正在使用中.例如,BuildIntegratedNuGetProject类似乎返回project.json中包的包引用,而不管它们在磁盘上的状态如何.这也可以解释为什么FolderNuGetProject只返回一个空的可枚举,因为如果你只是查看本地存储库,就没有"声明"的包.

TL; DR:抓取本地软件包商店并获取其中存在的软件包和版本的最佳方法是什么?

(这也是NuGet GitHub项目的问题#2664,但是被请求移到了这里)

c# nuget

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

如何将标头添加到IIS URL重写重定向操作?

我正在尝试为HSTS预加载准备一个站点,其中一个要求是根域也支持HSTS.我在"www."页面上提供服务.所以我需要从根域重定向到"www".子域.由于这是一个托管在Azure上的静态站点,我试图将其全部用于IIS URL重写模块.

这是我到目前为止所拥有的:

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <clear />
        <!-- http -> https -->
        <rule name="https" enabled="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
                <add input="{HTTPS}" pattern="off" ignoreCase="true" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
        </rule>
        <!-- https://anything -> https://www.example.com -->
        <rule name="redirect" enabled="true">
            <match url="(.*)" />
            <conditions logicalGrouping="MatchAll">
                <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                <add input="{HTTP_HOST}" pattern="^(?!www.example.com$).*$" />
            </conditions>
            <action type="Redirect" url="https://www.example.com{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
        </rule>
      </rules>
      <outboundRules>
          <rule name="hsts" enabled="true">
              <match serverVariable="RESPONSE_Strict_Transport_Security" pattern=".*" />
              <conditions>
                  <add input="{HTTPS}" pattern="on" ignoreCase="true" /> …
Run Code Online (Sandbox Code Playgroud)

iis redirect web-config url-rewriting hsts

5
推荐指数
0
解决办法
1626
查看次数