我有一个Visual Studio 2008解决方案,其中包含> 40 C#和C++/CLI项目,这些项目相互依赖.使用该解决方案非常缓慢,通常我一次只需要几个项目.所以我决定将解决方案分成多个包含3-5个项目的解决方案.我还希望保留所有项目的"完整"解决方案(它对于自动构建或影响所有项目的大型重构操作非常方便).(这是这里的主要条件.否则,将项目拆分成解决方案当然是微不足道的.)
有没有办法做到这一点?
我的第一个想法是创建新的空解决方案,并将一些现有的项目文件添加到每个解决方案中.但是,如果我这样做,VS再也找不到项目引用(因为它们不在同一个解决方案中).我可以将引用添加为"普通"文件引用.但是,如果我这样做,我的"完整"解决方案将不再起作用,因为依赖关系将丢失.
编辑:
谢谢大家的答案.我想澄清一下我的问题:我的解决方案包含44个项目,不包括测试.因此,将它分成两部分并不是我想到的,我更多地考虑5-8个部分.这就是为什么我想保持"完整"的解决方案,VS可以找出完整版本的正确构建顺序.手动维护8个独立解决方案的构建顺序(例如在批处理文件中)似乎容易出错.
此外,我想"按逻辑"对项目进行分组(即我希望将项目通常在一个解决方案中一起修改).但是这种分组并不总是与依赖性相匹配.例如,假设我有依赖链
A is referenced by B is referenced by C is referenced by D
Run Code Online (Sandbox Code Playgroud)
并且假设A和D经常被一起修改,但B和C很少改变.(显然,B使用的A接口必须保持不变.)然后我想在一个解决方案中使用A和D,在另一个解决方案中使用B和C. 但是,只有当我想从头开始构建所有项目时,我才能拥有包含A,B,C和D的完整"完整"解决方案.一旦构建完成,我就可以打开我的A/D解决方案并仅编辑/构建这两个项目.
但我担心我的问题没有优雅的解决方案.(双关语不打算)
我在MSDN上的某个地方读过,相当于C#的"is"关键字将是dynamic_cast,但这并不是真正等效的:它不适用于值类型或泛型参数.例如在C#中我可以写:
void MyGenericFunction<T>()
{
object x = ...
if (x is T)
...;
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试"等效"C++/CLI:
generic<class T>
void MyGenericFunction()
{
object x = ...
if (dynamic_cast<T>(x))
...;
}
Run Code Online (Sandbox Code Playgroud)
我得到一个编译器错误"错误C2682:不能使用'dynamic_cast'从'System :: Object ^'转换为'T'".
我唯一能想到的就是使用反射:
if (T::typeid->IsAssignableFrom(obj->GetType()))
Run Code Online (Sandbox Code Playgroud)
有更简单的方法吗?
在我的WPF应用程序中,我想显示如下所示的内容:
用户Bob已于22:17退出.
"Bob"和"22:17"是数据绑定值.
显而易见的方法是使用StackPanel
带有多个TextBlock
子节点的子节点,其中一些绑定数据:
<StackPanel Orientation="Horizontal">
<TextBlock Text="The user"/>
<TextBlock Text="{Binding Path=Username}" TextBlock.FontWeight="Bold" />
<TextBlock Text="has logged off at"/>
<TextBlock Text="{Binding Path=LogoffTime}" TextBlock.FontWeight="Bold" />
</StackPanel/>
Run Code Online (Sandbox Code Playgroud)
这有效,但很难看.该程序应该被本地化为不同的语言,并且具有"用户"和"已注销"的单独字符串是本地化灾难的接收者.
理想情况下,我想做这样的事情:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}The user <Bold>{0}</Bold> has logged off at <Bold>{1}</Bold>">
<Binding Path="Username" />
<Binding Path="LogoffTime" />
</MultiBinding>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
所以译者会看到一个完整的句子The user <Bold>{0}</Bold> has logged off at <Bold>{1}</Bold>
.但这当然不起作用.
这必须是一个常见的问题,对此有什么正确的解决方案?
我的应用程序在Windows XP上运行,VNC服务器也在PC上运行.我想知道某人当前是否已连接到VNC服务器(例如,使用更简单的图标).我正在使用UltraVNC.
有一个简单的(最好是文件化的)方法吗?
编辑:显然有人投票结束因为他/她认为这属于超级用户,所以我想我应该澄清一个问题:我需要一个程序化的解决方案,最好是在.NET或C++中.(这对用户来说是微不足道的:只需查看托盘中的VNC图标.)
许多GDI +类实现了IDisposable,但我不确定何时应该调用Dispose.对于我使用的new
静态方法创建的实例很明显Graphics.CreateGraphics
.但是属性getter返回的对象呢?我经常写这样的代码:
var oldRgn = g.Clip;
using (var rectRegion = new Region(rectangle))
{
g.Clip = rectRegion;
// draw something
}
g.Clip = oldRgn;
Run Code Online (Sandbox Code Playgroud)
我应该oldRgn
在那之后处理吗?我的内存分析器告诉我,如果不这样做,会有一些不相关的实例.在反射器中查看实现至少可以确认getter在每次调用时都显然创建了一个新实例:
// Graphics.Clip code from Reflector:
public Region get_Clip()
{
Region wrapper = new Region();
int status = SafeNativeMethods.Gdip.GdipGetClip(new HandleRef(this, this.NativeGraphics), new HandleRef(wrapper, wrapper.nativeRegion));
if (status != 0)
{
throw SafeNativeMethods.Gdip.StatusException(status);
}
return wrapper;
}
Run Code Online (Sandbox Code Playgroud)
我在MSDN中找不到任何相关内容,文档中的示例似乎从未处理过任何内容.
我已经读过托管堆中的固定对象会影响.NET中的GC性能,因为如果存在固定对象,GC就无法压缩内存.但是由于大对象堆无论如何都没有被压缩,所以这不应该适用于LOH中的对象.固定LOH中的物体还有其他隐藏成本吗?或者我可以安全地将对象固定在LOH中而不会降低GC性能吗?
我正在使用WPFLocalizationExtension来本地化我的WPF应用程序.我对运行时行为非常满意,但手动将字符串属性提取到ResX文件非常繁琐.
有没有办法实现自动化?我曾经有一个名为Xaml Localizer Addin的工具就是这样做的(下面的截图),但它只适用于VS2008,我找不到更新的版本.
当我在Windows上的网络连接上打开属性时,我看到这个对话框: Connection_Properties http://www.freeimagehosting.net/uploads/ca7a4d82ea.png
在此对话框中,在复选框列表框中,我可以启用或禁用"文件或打印机共享","Microsoft网络客户端"或网络过滤器驱动程序等选项.
我的问题是:如何以编程方式启用/禁用这些选项?我在WMI文档中找不到任何类似的内容,但我找不到任何其他的Win32 API.我更喜欢C Win32 API或WMI接口,但欢迎使用任何编程语言的解决方案.这个问题与语言无关.
我有一个WPF应用程序,托管一个无模式的Win32表单.一切都顺利进行,直到我将VNC连接或拆卸到机器上.然后应用程序死锁:它不再重绘任何东西,不会对用户交互作出反应.我使用WinDbg查看了堆栈跟踪:
0012f03c 792b6865 System.Threading.WaitHandle.WaitOne(Int32, Boolean)
0012f050 7b6f1a4f System.Windows.Forms.Control.WaitForWaitHandle(System.Threading.WaitHandle)
0012f064 7ba2d68b System.Windows.Forms.Control.MarshaledInvoke(System.Windows.Forms.Control, System.Delegate, System.Object[], Boolean)
0012f104 7b6f33ac System.Windows.Forms.Control.Invoke(System.Delegate, System.Object[])
0012f138 7b920bd7 System.Windows.Forms.WindowsFormsSynchronizationContext.Send(System.Threading.SendOrPostCallback, System.Object)
0012f150 7a92ed62 Microsoft.Win32.SystemEvents+SystemEventInvokeInfo.Invoke(Boolean, System.Object[])
0012f184 7a92dc8f Microsoft.Win32.SystemEvents.RaiseEvent(Boolean, System.Object, System.Object[])
0012f1d0 7a92daec Microsoft.Win32.SystemEvents.OnDisplaySettingsChanging()
0012f1e0 7a574c9f Microsoft.Win32.SystemEvents.WindowProc(IntPtr, Int32, IntPtr, IntPtr)
0012f1e4 003c20dc [InlinedCallFrame: 0012f1e4]
0012f3a8 57843a57 System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
0012f3f8 57843129 System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
0012f404 578430cc System.Windows.Threading.Dispatcher.Run()
0012f410 55bed46e System.Windows.Application.RunDispatcher(System.Object)
0012f41c 55bec76f System.Windows.Application.RunInternal(System.Windows.Window)
0012f440 55bd3aa6 System.Windows.Application.Run(System.Windows.Window)
0012f450 55bd3a69 System.Windows.Application.Run()
Run Code Online (Sandbox Code Playgroud)
显然,VNC附加/分离引发一个OnDisplaySettingsChanging
事件,该事件又试图使用一个事件来调用某个事件System.Windows.Forms.Control.Invoke
,该事件向主线程发送一条消息然后等待响应.但由于这一切都发生在主线程中,消息循环永远不会得到消息,等待永远不会返回.
我找到了一个使用的解决方法EnableSystemEventsThreadAffinityCompatibility
(基本上绕过了Control.Invoke
调用),但感觉就像一个肮脏的黑客.
有人见过这样的事吗?
有人知道为什么当消息到达主(STA)线程时,SystemEvents
类会使用Control.Invoke …
在我的应用程序中,我在后台(线程池)线程中创建Freezable
对象,冻结它们,然后在主线程上显示它们。一切正常,除了一段时间后,整个系统变得缓慢并且应用程序最终崩溃。
我已经设法将问题减少到这一行:
var temp = new DrawingGroup();
Run Code Online (Sandbox Code Playgroud)
如果您在不同的后台(非 UI)线程上运行得足够频繁,整个系统就会变得缓慢,最终应用程序崩溃。
(在我的实际应用程序中,然后我向该对象绘制一些内容,冻结它,然后将其显示在主线程上,但这并不是重现问题所必需的。)
重现该问题的完整代码(复制到默认的空白 wpf 应用程序中):
public partial class MainWindow : Window
{
private DispatcherTimer dt;
public MainWindow()
{
InitializeComponent();
dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromSeconds(0.1);
dt.Tick += dt_Tick;
dt.IsEnabled = true;
}
private int counter = 0;
void dt_Tick(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
var thread = new Thread(MemoryLeakTest);
thread.Start();
}
Title = string.Format("Mem leak test {0}", counter++);
}
private …
Run Code Online (Sandbox Code Playgroud) wpf ×4
.net ×3
binding ×1
c# ×1
c++-cli ×1
gdi+ ×1
localization ×1
networking ×1
vnc-server ×1
windows ×1
winforms ×1
xaml ×1