假设我有两个项目,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?
我想要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) 我有一个使用多个线程的集成测试.我希望任何线程能够通过测试(并拆除其余部分).但是,后台线程上的异常导致MSTest失败 - 您只是得到一个错误:
在测试运行时,代理程序进程已停止
我想我可以在后台线程上捕获任何异常,并唤醒主线程以使测试失败,但是有更简单/更优雅的方式吗?
我想创建几个字符串对的短(有序)列表,并在代码中有一个简洁的文字表示.有一个很好的方法来做到这一点?我能想到的最好的是
using Pairs = System.Collections.Specialized.OrderedDictionary;
...
var z = new Pairs()
{
{ "a", "b" },
{ "c", "d" }
};
Run Code Online (Sandbox Code Playgroud)
但缺乏类型安全性有点可怕.似乎没有通用的有序字典.
还有哪些类具有文字初始化语法?是否可以为类定义自己的初始化语法?
我们有一些代码会在某些机器上产生意外结果.我把它缩小到一个简单的例子.在下面的linqpad片段中,方法GetVal和GetVal2实现基本相同,尽管前者还包括对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)
为什么会发生这种情况,是否有一种避免它的简单方法?与寄存器有关?
我最近将所有测试项目从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位平台上运行时.在降级测试项目之前没有发生此问题.
在我的解决方案中,我有对(例如)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或其依赖项之一。该系统找不到指定的文件。确认声明正确,并且程序集及其所有依赖项均可用。
我正在调查我们的应用程序中的GC和内存使用,并注意到我们似乎有成千上万的终结幸存者.不幸的是,这个数字并不能真正告诉我我们是否有问题.然而,我们看到了一般性能问题,并且我们确实使用了大量内存并且在GC中花费了大量时间.
理想情况下,我们无法控制的任何内容都应该进入终结队列.这是一个错误,如果它.我可以使用一些方法或工具来检查这个吗?我听到的一个建议是使用终结器进行特殊构建,只要它们被执行就会记录,但这需要付出很多努力,并且只适用于我们拥有类型的对象.有没有更简单的方法?
是否值得调查最终幸存者?如果是这样,怎么样?
我无法以编程方式(在c#中)找到".NET CLR Memory"计数器类别,就像在这个问题中一样.以管理员身份运行解决了问题.
但为什么我需要这样做呢?还有其他选择吗?我想要只读访问,在我的应用程序中查看GC生成集合以进行性能分析.最好不必使用管理员权限运行应用程序.
编辑:
我想写一个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) c# ×8
.net ×2
assert ×1
clr ×1
com ×1
com-interop ×1
dispose ×1
finalizer ×1
function ×1
keyvaluepair ×1
literals ×1
moq ×1
msbuild ×1
mstest ×1
performance ×1
powershell ×1