小编Rob*_*Rob的帖子

我的.Net应用程序可以引用两个不同版本的.net框架库吗?

假设我有两个项目,P4和P3,分别针对.net 4.0和3.5.

每个项目还有一个System.Data的引用.在P4的情况下,它将是System.Data v4.0.0.0在P3的情况下,它将是System.Data v2.0.0.0

P4项目也参考了P3.

如果加载并执行P4,它将使用.net 4.0 CLR.在运行时,对System.Data的引用似乎在P4和P3内解析为v4.0.我可以通过使用assemblyBinding重定向覆盖它,但P4和P3都解析为v2.0.

有什么方法可以配置我的应用程序,以便P4使用v4.0和P3使用v2.0?

.net c# clr multitargeting

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

Moq是一个索引属性,并使用返回/回调中的索引值

我想要moq一个具有索引的属性,并且我希望能够在回调中使用索引值,就像在moq方法的回调中使用方法参数一样.可能最容易用一个例子演示:

public interface IToMoq
{
    int Add(int x, int y);
    int this[int x] { get; set; }
}

    Action<int, int> DoSet = (int x, int y) =>
    {
        Console.WriteLine("setting this[{0}] = {1}", x, y);
        throw new Exception("Do I ever get called?"); 
    };
    var mock = new Mock<IToMoq>(MockBehavior.Strict);

    //This works perfectly
    mock.Setup(m => m.Add(It.IsAny<int>(), It.IsAny<int>()))
        .Returns<int, int>((a, b) => a + b);

    //This compiles, but my callback never seems to be called
    mock.SetupSet(m => m[It.IsAny<int>()] = It.IsAny<int>())
        .Callback(DoSet);

    var obj = …
Run Code Online (Sandbox Code Playgroud)

c# moq indexed-properties

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

从后台线程失败MSTest

我有一个使用多个线程的集成测试.我希望任何线程能够通过测试(并拆除其余部分).但是,后台线程上的异常导致MSTest失败 - 您只是得到一个错误:

在测试运行时,代理程序进程已停止

我想我可以在后台线程上捕获任何异常,并唤醒主线程以使测试失败,但是有更简单/更优雅的方式吗?

c# multithreading assert mstest

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

在c#中表示字符串对列表的最简单方法?

我想创建几个字符串对的短(有序)列表,并在代码中有一个简洁的文字表示.有一个很好的方法来做到这一点?我能想到的最好的是

     using Pairs = System.Collections.Specialized.OrderedDictionary;
     ...
            var z = new Pairs()
            {
                { "a", "b" },
                { "c", "d" }
            };
Run Code Online (Sandbox Code Playgroud)

但缺乏类型安全性有点可怕.似乎没有通用的有序字典.

还有哪些类具有文字初始化语法?是否可以为类定义自己的初始化语法?

c# literals keyvaluepair

5
推荐指数
2
解决办法
5268
查看次数

不相关的代码会更改计算结果

我们有一些代码会在某些机器上产生意外结果.我把它缩小到一个简单的例子.在下面的linqpad片段中,方法GetValGetVal2实现基本相同,尽管前者还包括对NaN的检查.但是,每个返回的结果都不同(至少在我的机器上).

void Main()
{
    var x = Double.MinValue;
    var y = Double.MaxValue;
    var diff = y/10 - x/10;

    Console.WriteLine(GetVal(x,6,diff));
    Console.WriteLine(GetVal2(x,6,diff));
}

public static double GetVal(double start, int numSteps, double step)
{
    var res = start + numSteps * step;
    if (res == Double.NaN)
        throw new InvalidOperationException();
    return res;
}

public static double GetVal2(double start, int numSteps, double step)
{
    return start + numSteps * step;
}
Run Code Online (Sandbox Code Playgroud)

结果

3.59538626972463E+307
Infinity
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,是否有一种避免它的简单方法?与寄存器有关?

c# floating-point cpu-registers

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

如何让MSBuild生成与平台无关的COMReference?

我最近将所有测试项目从dotnet 4切换到了dotnet 3.5(因为我想在CLR 2.0下测试代码(见这里).大多数工作正常,但是一个测试项目依赖于IWshRuntimeLibrary.这由以下csproj指定片段:

<COMReference Include="IWshRuntimeLibrary">
  <Guid>{F935DC20-1CF0-11D0-ADB9-00C04FD58A0B}</Guid>
  <VersionMajor>1</VersionMajor>
  <VersionMinor>0</VersionMinor>
  <Lcid>0</Lcid>
  <WrapperTool>tlbimp</WrapperTool>
  <Isolated>False</Isolated>
  <EmbedInteropTypes>True</EmbedInteropTypes>
</COMReference>
Run Code Online (Sandbox Code Playgroud)

我们将测试项目构建为"AnyCPU".当测试项目是.Net 4时,这似乎产生了一个ANYCPU interop dll.现在它是.Net 3.5,interop dll是x86,它System.BadImageFormatException在64位平台上运行时.在降级测试项目之前没有发生此问题.

c# com com-interop platform-independent

3
推荐指数
1
解决办法
2314
查看次数

我可以使用msbuild 4.0定位dotnet 3.5吗?

在我的解决方案中,我有对(例如)System.ServiceModel.dll的项目引用,其中“使用特定版本”设置为false。msbuild 3.5一切正常。

我想使用msbuild 4.0才能使用属性函数。我尝试传递属性“ TargetFrameworkVersion = 3.5; ToolsVersion = 3.5”。但是,出现以下错误:

无法加载文件或程序集'C:\ WINDOWS \ Microsoft.Net \ assembly \ GAC_MSIL \ System.configuration \ v4.0_4.0.0.0__b03f5f7f11d50a3a \ System.configuration.dll'或其依赖项之一。

如果我使用msbuild 3.5,则不会发生这种情况。

我可以在不指定项目文件版本的情况下进行此工作吗?(将来我们可能希望将应用程序升级到dotnet 4)

编辑:我尝试在“外部”调用中使用msbuild 3.5,并<msbuild>为那些需要新功能的目标调用msbuild(使用任务)4.0。这也没有运气-内部调用会给出以下错误消息:

错误MSB4062:无法加载文件或程序集'Microsoft.Build.Tasks.v4.0,Version = 4.0.0.0或其依赖项之一。该系统找不到指定的文件。确认声明正确,并且程序集及其所有依赖项均可用。

msbuild .net-framework-version

3
推荐指数
1
解决办法
6498
查看次数

如何调查终结队列和终结幸存者

我正在调查我们的应用程序中的GC和内存使用,并注意到我们似乎有成千上万的终结幸存者.不幸的是,这个数字并不能真正告诉我我们是否有问题.然而,我们看到了一般性能问题,并且我们确实使用了大量内存并且在GC中花费了大量时间.

理想情况下,我们无法控制的任何内容都应该进入终结队列.这是一个错误,如果它.我可以使用一些方法或工具来检查这个吗?我听到的一个建议是使用终结器进行特殊构建,只要它们被执行就会记录,但这需要付出很多努力,并且只适用于我们拥有类型的对象.有没有更简单的方法?

是否值得调查最终幸存者?如果是这样,怎么样?

c# performance garbage-collection dispose finalizer

3
推荐指数
1
解决办法
1619
查看次数

为什么我需要管理员来阅读.NET CLR内存性能计数器

我无法以编程方式(在c#中)找到".NET CLR Memory"计数器类别,就像在这个问题中一样.以管理员身份运行解决了问题.

但为什么我需要这样做呢?还有其他选择吗?我想要只读访问,在我的应用程序中查看GC生成集合以进行性能分析.最好不必使用管理员权限运行应用程序.

编辑:

  • 我可以在性能监视器工具中看到内存性能计数器,而无需以管理员身份运行
  • 如果不以Admin身份运行,我可以通过编程方式获得一个缩短(但不是空)的性能计数器类别列表,但这不包括我感兴趣的那个.
  • 我们的公司设置有点疯狂:我有管理员权限,但我不是本地管理员组的成员.我确实有权添加自己,但每30分钟左右一些自动化过程会删除我.不知道这是否会影响任何事情
  • 将自己添加到性能监视器用户组没有任何效果(除非我需要先重启)

.net c# performancecounter

3
推荐指数
2
解决办法
1184
查看次数

从scriptblock动态创建PowerShell脚本块

我想写一个powershell函数,它通过基于作为输入参数传入的scriptblock动态创建一个scriptblock来返回一个scriptblock.我似乎没有太多运气.

编写一个方法来调用scriptblock两次很容易.

$x = { write-host "Hello" }
function DoIt([scriptblock] $s) { $s.Invoke(); }
function DoItTwice([scriptblock] $s) { $s.Invoke(); $s.Invoke(); }

DoIt($x)
DoItTwice($x)
Run Code Online (Sandbox Code Playgroud)

编写一个返回脚本块的方法更加困难,该脚本块具有两次调用(输入)scriptblock的效果.以下不起作用

function TwiceAsScriptBlock([scriptblock] $s)
{
    function twice
    {
        $s.Invoke();
        $s.Invoke();
    }
    return { twice }
}
Run Code Online (Sandbox Code Playgroud)

powershell function

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