小编Kel*_*sie的帖子

为什么关闭以AllocConsole启动的控制台会导致我的整个应用程序退出?我可以改变这种行为吗?

我想要发生的事情是控制台窗口消失了,或者更好,但它是隐藏的,但我希望我的应用程序继续运行.那可能吗?我希望能够使用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并不会阻止应用程序终止.

.net c# console winapi console-application

27
推荐指数
3
解决办法
9749
查看次数

在基类型中引用派生类型是不好的形式?

我有一个类别/文件树结构.类别和文件都可以包含父类,因此我从具有Parent属性的公共基类派生它们.由于所有父项显然都是类别(文件不能是父类),因此将节点的Parent属性设置为CategoryNode类似似乎是有意义的.

基类引用派生类是不好的形式?如果是这样,为什么?如果是这样的话,有什么更好的方法呢?

class Node {
    public CategoryNode Parent {get; set;}
}

class File : Node {
    ...
}

class CategoryNode : Node {
    ...
}
Run Code Online (Sandbox Code Playgroud)

c# oop inheritance

8
推荐指数
2
解决办法
169
查看次数

在终结器中抛出异常以强制执行Dispose调用:

以下是我认为推荐的典型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)

.net c# dispose idisposable

6
推荐指数
1
解决办法
2127
查看次数

使用SDL_SetVideoMode时,有没有办法获取内部SDL_Window指针或ID?

如果您使用 SDL_SetVideoMode() 创建窗口,您将返回一个表面,而不是窗口句柄。有没有办法获取SDL_Window句柄?我知道有一个 SDL_GetWindowFromID 函数,但我也不确定如何获取 ID,除了 SDL_GetWindowID 函数之外,这需要我已经拥有窗口句柄。

有什么建议么?请注意,保持跨平台可移植性非常重要,因此如果可能的话,我更愿意坚持使用内置的 SDL 功能。

如果有帮助的话,我正在尝试获取和设置窗口位置和窗口大小,而这些函数需要窗口句柄。

谢谢!

编辑:我还应该提到,我正在根据用户的请求更改视频模式,因此我不能只使用默认 ID 1,因为每次调用 SDL_SetVideoMode() 时该 ID 都会更改。

c++ sdl

5
推荐指数
1
解决办法
2462
查看次数

自定义MSBuild任务取决于编译后的代码,但还会生成依赖于以下代码的代码

我正在尝试生成一个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)

c# msbuild

2
推荐指数
1
解决办法
466
查看次数