我想要发生的事情是控制台窗口消失了,或者更好,但它是隐藏的,但我希望我的应用程序继续运行.那可能吗?我希望能够使用Console.WriteLine并将控制台用作输出窗口.我希望能够隐藏和显示它,并且我不希望整个应用程序因为控制台关闭而死亡.
编辑
码:
internal class SomeClass {
[DllImport("kernel32")]
private static extern bool AllocConsole();
private static void Main() {
AllocConsole();
while(true) continue;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2
我根据这个问题的评论中的建议尝试了这里接受的解决方案[ Capture console exit C# ].示例代码的错误在于DLLImport需要是"kernel32.dll"或"kernel32",而不是"Kernel32".进行更改后,当我单击控制台窗口上的X时,我正在向CTRL_CLOSE_EVENT的处理程序发送消息.但是,调用FreeConsole和/或返回true并不会阻止应用程序终止.
我有一个类别/文件树结构.类别和文件都可以包含父类,因此我从具有Parent属性的公共基类派生它们.由于所有父项显然都是类别(文件不能是父类),因此将节点的Parent属性设置为CategoryNode类似似乎是有意义的.
基类引用派生类是不好的形式?如果是这样,为什么?如果是这样的话,有什么更好的方法呢?
class Node {
public CategoryNode Parent {get; set;}
}
class File : Node {
...
}
class CategoryNode : Node {
...
}
Run Code Online (Sandbox Code Playgroud) 以下是我认为推荐的典型IDisposable实现:
~SomeClass() {
Dispose(false);
}
public void Dispose() {
GC.SuppressFinalize(this);
Dispose(true);
}
protected virtual void Dispose(bool isDisposing) {
if(isDisposing) {
// Dispose managed resources that implement IDisposable.
}
// Release unmanaged resources.
}
Run Code Online (Sandbox Code Playgroud)
现在,根据我的理解,终结器背后的想法是,如果我不调用Dispose,我的非托管资源仍将正常发布.但是,据我所知,人们普遍认为不在实现IDisposable的对象上调用Dispose可能是一个bug.
有没有特别的理由不完全接受这一点而是这样做呢?
~SomeClass() {
throw new NotImplementedException("Dispose should always be called on this object.");
}
public virtual void Dispose() {
GC.SuppressFinalize(this);
// Dispose managed resources that implement IDisposable.
// Release unmanaged resources.
}
Run Code Online (Sandbox Code Playgroud) 如果您使用 SDL_SetVideoMode() 创建窗口,您将返回一个表面,而不是窗口句柄。有没有办法获取SDL_Window句柄?我知道有一个 SDL_GetWindowFromID 函数,但我也不确定如何获取 ID,除了 SDL_GetWindowID 函数之外,这需要我已经拥有窗口句柄。
有什么建议么?请注意,保持跨平台可移植性非常重要,因此如果可能的话,我更愿意坚持使用内置的 SDL 功能。
如果有帮助的话,我正在尝试获取和设置窗口位置和窗口大小,而这些函数需要窗口句柄。
谢谢!
编辑:我还应该提到,我正在根据用户的请求更改视频模式,因此我不能只使用默认 ID 1,因为每次调用 SDL_SetVideoMode() 时该 ID 都会更改。
我正在尝试生成一个C#代码文件,该文件基于XML文件构造一个对象树。XML中的元素引用正在编译的项目中定义的类型。生成的代码需要构造一个类型的对象树,该对象树在正在编译的项目中找到。为了使事情更复杂,需要将生成的代码编译到正在编译的项目中,并由正在编译的当前项目中的代码引用。
我目前正在尝试使用自定义MSBuild任务来执行此操作。该任务将分发给其他开发人员以在他们自己的项目中使用,因此我无法将可用的类型硬编码到任务中。
这是一些示例代码来说明我在做什么:
// This is not generated
public class SomeClass {
public void DoSomething() {}
public string SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
SomeClass是在项目的未生成代码中定义的Type。这是引用SomeClass并填充SomeProperty属性的XML文件:
... bunch of XML...
<SomeClass SomeProperty="SomeValue" />
... bunch more XML...
Run Code Online (Sandbox Code Playgroud)
SomeOtherClass具有一个未生成的部分声明:
// This is not generated
public partial class SomeOtherClass {
public void SomeMethod() {
someField.DoSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
任务创建部分SomeOtherClass声明:
// This is generated
public partial class SomeOtherClass {
private SomeClass someField = new SomeClass() {
SomeProperty …Run Code Online (Sandbox Code Playgroud)