我在VS2013中创建了一个单元测试项目,我用它来为我的SQL Server 2012数据库创建一个测试套件.
到目前为止,我创建了4个测试类,一切正常.当我创造第5个 - 魔法!所有测试都从测试资源管理器窗口中消失.
我尝试重建项目 - 没有用.也重建了数据库项目; 没用.创建了一个新的单元测试项目,其中包含单个单元测试 - 不起作用.
这发生在任何人身上吗?有谁知道该怎么办?请帮忙!
注意:这不仅仅是一些随机无用的代码,这是尝试在C#中重现lambda表达式和内存泄漏的问题.
在C#中检查以下程序.这是一个简单的控制台应用程序:
我使用JetBrains DotMemory运行这个程序,我带了两个内存快照:一个在初始化对象后,另一个在收集后.我比较了快照并得到了我所期望的:一个类型为Test的死对象.
但这是窘境:然后我在对象的构造函数中创建一个本地lambda表达式,我不会在任何地方使用它.它只是一个本地构造函数变量.我在DotMemory中运行相同的过程,突然间,我得到了一个Test + <>类型的对象,它可以在垃圾回收中幸存下来.
请参阅DotMemory附带的保留路径报告:lambda表达式有一个指向Test + <>对象的指针,这是预期的.但谁有指向lambda表达式的指针,为什么它保存在内存中?
另外,这个Test + <>对象 - 我认为它只是暂存对象来保存lambda方法,并且与原始的Test对象无关,我是对的吗?
public class Test
{
public Test()
{
// this line causes a leak
Func<object, bool> t = _ => true;
}
public void WriteFirstLine()
{
Console.WriteLine("Object allocated...");
}
public void WriteSecondLine()
{
Console.WriteLine("Object deallocated. Press any button to exit.");
}
}
class Program
{
static void Main(string[] args)
{
var t = new Test();
t.WriteFirstLine();
Console.ReadLine();
t.WriteSecondLine();
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect(); …
Run Code Online (Sandbox Code Playgroud) 我创建了一个存储过程,它执行一系列需要特殊权限的操作,例如create database,restore database等.我创建了这个存储过程
execute as self
Run Code Online (Sandbox Code Playgroud)
...所以它作为SA运行.这是因为我想给一个没有任何权限的SQL用户只能运行我定义的这些命令.
但是当我运行这个存储过程时,我得到了
The server principal "sa" is not able to access the database "model" under the current security context.
Run Code Online (Sandbox Code Playgroud)
为什么SA无法访问模型数据库?我实际上在SA下运行存储过程中的代码,它运行正常.
我为这个愚蠢的问题道歉.我正在维护旧的遗留VB6代码,我有一个实际工作的功能 - 但我根本无法弄清楚它为何起作用,或者为什么没有它就无法运行代码.
基本上,此函数读取UTF-8文本文件并在DHTMLEdit组件中显示其内容.它的方式是,它将整个文件读入一个字符串,然后使用ANSI代码页将其从双字节转换为多字节字符串,然后将其转换回双字节.
使用这整个精心设计的机制可以使组件同时正确显示包含希伯来语,阿拉伯语,泰语和中文的页面.不使用此代码使文本看起来像被转换为ASCII,显示字母曾经的各种标点符号.
我不明白的是:
[码]
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal codePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long
Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal codePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByVal lpMultiByteStr As Long, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, lpUsedDefaultChar As Long) …
Run Code Online (Sandbox Code Playgroud) 我有一个静态Configuration
类负责整个系统的数据设置.它在构造函数中从注册表加载某些值,并且它的所有方法都基于这些值.如果它无法从注册表中获取值(如果应用程序尚未激活,则可能),它会抛出一个异常,转换为a TypeInitializationException
,这对我很好.
我使用NUnit编写了单元测试,以确保Configuration的构造函数正确处理所有情况 - 正常值,空值,空值.每个测试使用相关值初始化注册表,然后在Configuration中调用一些方法.这就是问题所在:NUnit决定先运行Null测试.它清除注册表,初始化Configuration,抛出异常 - 一切都很好.但是,因为这是一个静态类,其构造函数只是失败了 - 它不会为其他测试重新构造类,它们都会失败.
即使没有Null测试,我也会遇到问题,因为对于所有使用它的类,配置可能(我猜)会被初始化一次.
我的问题是:我应该使用反射为每个测试重新构造类,还是应该重新设计此类以检查属性中的注册表而不是构造函数?
我正在尝试在当前域中查找用户。代码是这样的:
DirectoryEntry domain = new DirectoryEntry("LDAP://CN-Users, DC=" + Environment.UserDomainName);
DirectoryEntries entries = domain.Children;
try
{
// The following line causes the exception
DirectoryEntry user = entries.Find("(&(objectCategory=user)(cn=" + userName + "))", ActiveDirectoryEntryType.User.TypeName);
user.DeleteTree();
user.CommitChanges();
}
catch
{}
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
An invalid dn syntax has been specified.
Run Code Online (Sandbox Code Playgroud)
我也尝试了以下代码并得到了同样的错误:
DirectoryEntry user = entries.Find(userName, ActiveDirectoryEntryType.User.TypeName);
Run Code Online (Sandbox Code Playgroud)
我在帮助文件中找不到有关正确语法的信息。有谁知道这是怎么做的?
我有一个一般的数据库设计问题。
我在数据库中有一个表,其中某个字段在插入时应始终具有值 0。将此字段更改为 0 以外的任何值涉及某些操作,这些操作是通过更新触发器强制执行的。如果没有执行适当的业务规则,值为 0 的记录是无用的数据。
我正在考虑在插入时创建一个替代触发器,以强制您不能使用 0 以外的任何值将记录插入到该表中。这不是真正必要的,因为用户只能通过存储过程访问数据库,并且目前唯一的 INSERT 过程将此值设置为默认值,即 0。这也不是一种安全措施,因为在我们的系统中,只有 SA 是特权用户,如果用户以某种方式获得了 SA 密码,他们可以做任何他们想做的事反正想要
我能想到的唯一用途是确保即使在将来,开发人员也不会意外地允许将值插入此字段而不会绊倒触发器,这确实是一个测试工具。
DBA 如何处理这样的事情?您是否有特定于测试系统的触发器和约束,它们不部署到生产服务器?您是否将这些触发器留在生产服务器上,作为强制执行完整性的额外措施?
我不确定我是否理解使用 System.Diagnostics.Tracing 和使用 System.Diagnostics.Trace 的 ETW 之间的主要区别。据我了解,通过它们,我可以将事件转储到某些输出流上,并且我可以使用各种侦听器来拦截此数据 - 包括自定义侦听器。
但除了 ETW 的基础设施嵌入到 Windows 中并且我可以开箱即用地使用 WPR 和 PerfView 之外,我没有看到任何区别。
我什么时候会选择其中之一而不是另一个?
假设我有一个 C# 类,如下所示:
public class MyClass {
public SomeObject TheObject { get; }
public MyClass() {
TheObject = new SomeObject();
TheObject.MyEvent += MyEventHandler;
}
private void MyEventHandler() {
// some code
}
}
Run Code Online (Sandbox Code Playgroud)
该类创建一个名为 TheObject 的 SomeObject 类型的内部对象,并向该对象上的事件添加一个事件处理程序。
由于 TheObject 是一个公共属性,这意味着任何其他代码段都可以维护指向该对象的指针;反过来,这将使 MyClass 类型的对象保持活动状态,因为 TheObject 有一个以事件处理程序形式指向 MyClass 的指针。
因此,我认为保持此代码不受此事件影响的唯一方法是向 MyClass 添加终结器:
public ~MyClass() {
TheObject?.MyEvent -= MyEventHandler;
}
Run Code Online (Sandbox Code Playgroud)
这太糟糕了,因为终结器会将 MyClass 类型的对象提升到下一代 GC,但我是否正确地认为这是避免这种潜在内存泄漏的唯一方法?
我正在尝试创建一个有序列表,其中列表中的某些项目右侧有标签.标签应与其相关的列表项完美对齐.
这样的事情:
(label) 1. first item
2. second item
(label) 3. sub list: (a) first sub item
(b) second sub item
(c) third sub item
(label) 4. fourth item
...
Run Code Online (Sandbox Code Playgroud)
我想到的第一件事是一个表,但表中的列表在HTML中是无效的.
我想到的第二件事是在一个DIV中创建一个列表,在另一个DIV中创建标签,但是我无法将每个标签与相关列表项对齐.
我想到的第三件事就是根本不使用列表,只是编写数字,但是破碎的行不能正确缩进.
我能想出的唯一解决方案是一个表(或一组DIV),其中每个项都是单独设置的START属性.这显然是一个非常糟糕的解决方案,但它至少看起来不错.
还有其他解决方案吗?
c# ×5
memory-leaks ×2
sql-server ×2
css ×1
etw ×1
execute-as ×1
html5 ×1
lambda ×1
ldap ×1
nunit ×1
unit-testing ×1
vb6 ×1