在我正在处理的应用程序中,日志记录工具使用sprintf格式化写入文件的文本.所以,像:
char buffer[512];
sprintf(buffer, ... );
Run Code Online (Sandbox Code Playgroud)
当发送的消息对于手动分配的缓冲区而言变得太大时,这有时会导致问题.
有没有办法获得sprintf行为而无需像这样手动分配内存?
编辑:虽然sprintf是一个C操作,我正在寻找C++类型的解决方案(如果有的话!)让我得到这种行为......
我正在重构一个类,以便代码是可测试的(使用NUnit和RhinoMocks作为测试和隔离框架)并且发现我发现自己的方法依赖于另一个(即它取决于由其他方法创建的东西) ).类似于以下内容:
public class Impersonator
{
private ImpersonationContext _context;
public void Impersonate()
{
...
_context = GetContext();
...
}
public void UndoImpersonation()
{
if (_context != null)
_someDepend.Undo();
}
}
Run Code Online (Sandbox Code Playgroud)
这意味着要进行测试UndoImpersonation,我需要通过调用来设置它Impersonate(Impersonate已经有几个单元测试来验证它的行为).这对我来说闻起来很糟糕,但从某种意义上说,从调用此类的代码的角度来看它是有道理的:
public void ExerciseClassToTest(Impersonator c)
{
try
{
if (NeedImpersonation())
{
c.Impersonate();
}
...
}
finally
{
c.UndoImpersonation();
}
}
Run Code Online (Sandbox Code Playgroud)
如果我没有尝试编写单元测试UndoImpersonation并且发现自己必须通过调用其他公共方法来设置测试,我就不会这样做了.那么,这是一种难闻的气味,如果是这样,我该如何解决呢?
所以我有一个类的方法如下:
public class SomeClass
{
...
private SomeDependency m_dependency;
public int DoStuff()
{
int result = 0;
...
int someValue = m_dependency.GrabValue();
...
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
而且我已经决定m_dependency.GrabValue()每次调用而不是每次调用,我真的想要将值缓存在内存中(即在这个类中),因为我们每次都会获得相同的值(依赖关闭并抓取一些数据)从几乎没有变化的表格.
我遇到了问题,但试图在单元测试中描述这种新行为.我尝试了以下(我正在使用NUnit和RhinoMocks):
[Test]
public void CacheThatValue()
{
var depend = MockRepository.GeneraMock<SomeDependency>();
depend.Expect(d => d.GrabValue()).Repeat.Once().Return(1);
var sut = new SomeCLass(depend);
int result = sut.DoStuff();
result = sut.DoStuff();
depend.VerifyAllExpectations();
}
Run Code Online (Sandbox Code Playgroud)
然而,这不起作用; 即使没有对功能进行任何更改,此测试也会通过.我究竟做错了什么?
我一直在研究以粗体显示菜单项所需的努力 - 无需自己绘制菜单 - 并MFS_DEFAULT在一些谷歌搜索后发现了菜单项状态。MSDN文档提到
MFS_DEFAULT
指定该菜单项是默认菜单项。一个菜单只能包含一个默认菜单项,该菜单项以粗体显示。
我进行了实验,似乎与文档相反,我似乎能够使用此标志以粗体显示多个(或可能全部!)菜单项。有谁有这方面的经验,即多个粗体菜单项是否存在任何陷阱?实现我想要实现的目标确实感觉有点麻烦,而且我有点担心未知的副作用(即在一个菜单中有多个“默认”菜单项)。
编辑:我还应该补充一点,本文声称该MFS_DEFAULT标志除了以粗体显示菜单项外什么也不做;尽管如此,我对违反“官方”文档还是有点警惕......
EDIT2:这样做的目的是告诉用户有问题的菜单项(即粗体的菜单项)也可以通过双击有问题的控件来调用(菜单项是上下文菜单的一部分)。当我思考这个问题时,我没有考虑这样一个事实:通常只有一个命令可以与双击事件关联(天啊!)。因此我接受了zaphod的回答(它没有直接回答这个问题,但它确实解决了我的“问题”)
我有一些VB6代码实例化一个类来处理从VB.NET组件引发的事件.VB6非常简单:
private m_eventHandler as new Collection
...
public sub InitSomething()
dim handler as EventHandler
set handler = new EventHandler
m_eventHandler.Add handler
...
m_engine.Start
end sub
Run Code Online (Sandbox Code Playgroud)
请注意,事件处理程序对象必须超出init方法的范围(这就是它存储在Collection中的原因).另请注意,这 m_engine.Start表示程序中VB.NET组件将开始引发事件的点.
实际的事件处理程序(根据要求):
Private WithEvents m_SomeClass As SomeClass
Private m_object as Object
...
Private Sub m_SomeClass_SomeEvent(obj As Variant)
Set obj = m_object
End Sub
Run Code Online (Sandbox Code Playgroud)
请注意,m_object在EventHandler创建实例时会初始化.
引发事件的VB.NET代码更简单:
Public ReadOnly Property SomeProp() As Object
Get
Dim obj As Object
obj = Nothing
RaiseEvent SomeEvent(obj)
SomeProp = obj
End Get
End Property
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我 …
基本上,我有类似以下内容:
public string SomeDBMethod(string server, string dbName, string userName, string password,...)
Run Code Online (Sandbox Code Playgroud)
将其重构为以下内容是否是一种好的做法:
public string SomeDbMethod(DBParams parameters, ...)
Run Code Online (Sandbox Code Playgroud)
其中 DBParams 定义如下:
public struct DBParams
{
string Server {get;set;}
string DbName {get;set;}
string UserName {get;set;}
string Password {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
我的观点是真正能够传递更少的参数,因为我发现具有长参数列表的函数确实非常难看。
我还发现这种方法有一些限制:如果 SomeDbMethod 要作为 Web 服务方法公开,我不能使用 DBParams 结构作为参数(据我对 Web 服务主题的理解...不是很远)。
那么,这是否太麻烦而没有什么好处,还是我在这里做了一些事情?
所以我有一堆内部类,我试图用RhinoMocks模拟.我在assemblyinfo.cs中添加了以下行:
[assembly:InternalsVisibleTo(RhinoMocks.StrongName)]
Run Code Online (Sandbox Code Playgroud)
但是,这仍然不允许我模拟内部类; 我从NUnit收到以下错误消息:
MyTests.SomeTest:System.TypeLoadException:来自程序集'DynamicProxyGenAssembly2,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'的类型'SomeType504cf40be6b444abfd417dccf5d6752'上的方法'SomeMethod'正在覆盖从该程序集中看不到的方法.
请注意,我使用的是RhinoMocks的"合并"版本(而不是使用Castle assembly'的下载选项).我不知道Castle是如何合并到RhinoMocks中的,但是不应该让我的内部对RhinoMocks可见,同样让它可以看到Castle(它是Rhino.Mocks.dll的一部分)?
IDataReader如果ExecuteReader抛出异常,我如何确保在下面的代码片段中被丢弃?
using (IDataReader rdr = cmd.ExecuteReader())
{
// use it
}
Run Code Online (Sandbox Code Playgroud)
我觉得using合成糖不会调用Dispose(因为没有实例可以调用它).但是,我怎样才能确定通常由实现IDisposable的类分配的稀缺资源将被释放?
我们正在使用Windows COM +服务类型库(位于C:\ Windows \ system32 \ COMSVCS.dll)来跟踪使用C#3.0 / .NET 3.5编写的服务的远程计算机上的COM +进程。我遇到的问题是,我从编译器中收到了很多警告,这些警告看起来类似于以下内容:
运行时封送程序无法封送“ IGetAppData.GetApps”的参数之一。因此,此类参数将作为指针传递,并且可能需要使用不安全的代码进行操作。
为上述方法生成的互操作函数签名为:
void IGetAppData.GetApps(out uint nApps, IntPtr aAppData)
Run Code Online (Sandbox Code Playgroud)
由于输出已经在调用代码中被手动编组(即使用Marshall.ReadInt32和Marshall.PtrToStructure),有没有办法抑制这些类型的警告?
假设嵌套在特定类中enum或者struct不嵌套在特定类中,即它属于项目命名空间,是否应该在以下位置定义:
Enums.cs或定义属于项目命名空间的Structs.cs所有enums/的文件structs有这样的事吗?
我说的是类似C++ new命令的东西,即内存分配,这需要显式释放内存(或冒险内存泄漏).
我问,因为我记得以前必须通过设置表单/控件/其他对象来解决一些GDI泄漏问题,Nothing但现在不记得是什么或为什么......
在VB6中开发时,我们是否需要担心内存管理?
我最近将.NET NLog日志记录组件集成到我们的一个应用程序中,这些应用程序纯粹是在非托管代码(在Visual Studio 6中编译的C++和VB6组件)中开发的.我们有一堆C++应用程序通过COM接口与NLog通信.
目前一切正常,但我注意到在程序终止期间弹出以下消息(在输出窗口中调试VS6中的C++组件;如果在IDE中调试NLog,则通过VS 2005调试NLog):
检测到LoaderLock消息:尝试在OS Loader锁定内执行托管执行.不要尝试在DllMain或图像初始化函数中运行托管代码,因为这样做会导致应用程序挂起.
DllMain如下:
extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpReserved*/)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
_Module.Init(ObjectMap, hInstance);
DisableThreadLibraryCalls(hInstance);
}
else if (dwReason == DLL_PROCESS_DETACH)
_Module.Term();
return TRUE; // ok
}
Run Code Online (Sandbox Code Playgroud)
我的猜测_Module.Term();现在包括释放一些.NET引用(我在我的一个C++类中保留对NLog对象的引用,以避免每次都必须实例化和释放),这会导致弹出此警告.
我的问题:这可以安全地忽略吗?如果不是,那么什么是好的解决方法?(我能想到的最好的方法是实例化对该NLog对象的引用,并在每次要写入日志文件时释放它...不是最优雅的解决方案)
我正在寻找有关良好资源的建议,那里有学习WMI.对所有类型感兴趣; 书籍,在线,网络广播等
c# ×6
c++ ×3
.net ×2
rhino-mocks ×2
tdd ×2
vb6 ×2
bold ×1
c ×1
castle ×1
debugging ×1
dispose ×1
events ×1
exception ×1
idisposable ×1
interop ×1
loaderlock ×1
marshalling ×1
memory ×1
menu ×1
nunit ×1
parameters ×1
resources ×1
string ×1
struct ×1
unit-testing ×1
unmanaged ×1
vb.net ×1
windows ×1
wmi ×1