Tag: C#的

.NET ObservableDictionary

我已经写了下面的类来实现(或试图!)带有通知的字典: public partial class ObservableDictionary<TKey, TValue> : Dictionary<TKey, TValue>, INotifyCollectionChanged { public ObservableDictionary() : base() { } public ObservableDictionary(int capacity) : base(capacity) { } public ObservableDictionary(IEqualityComparer<TKey> comparer) : base(comparer) { } public ObservableDictionary(IDictionary<TKey, TValue> dictionary) : base(dictionary) { } public ObservableDictionary(int capacity, IEqualityComparer<TKey> comparer) : base(capacity, comparer) { } public ObservableDictionary(IDictionary<TKey, TValue> dictionary, IEqualityComparer<TKey> comparer) […]

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

我想要发生的是控制台窗口刚刚消失,或者更好的是它隐藏了,但我希望我的应用程序继续运行。 那可能吗? 我希望能够使用Console.WriteLine并将控制台用作输出窗口。 我希望能够隐藏和显示它,而且我不希望整个应用程序因为控制台closures而死亡。 编辑 码: internal class SomeClass { [DllImport("kernel32")] private static extern bool AllocConsole(); private static void Main() { AllocConsole(); while(true) continue; } } 编辑2 我试着在这里接受的解决scheme[ 捕获控制台退出C# ],根据这个问题的意见中的build议。 该示例代码被错误的DLLImport需要是“kernel32.dll”或“kernel32”,而不是“Kernel32”。 进行更改之后,当我单击控制台窗口上的X时,我正在向CTRL_CLOSE_EVENT的处理程序发送消息。 但是,调用FreeConsole和/或返回true不会阻止应用程序终止。

解引用空指针

int* p = 0; int* q = &*p; 这是不确定的行为吗? 我浏览了一些相关的问题,但是这个具体方面没有显示出来。

C#中事件如何导致内存泄漏,弱引用如何帮助缓解这种情况?

有两种方式(我知道)在C#中导致无意的内存泄漏: 不处理实施IDisposable的资源 错误地引用和解引用事件。 我真的不明白第二点。 如果源对象比侦听器的生命周期更长,并且在没有其他引用的情况下侦听器不再需要事件,则使用正常的.NET事件将导致内存泄漏:源对象将侦听器对象保存在内存中应该被垃圾收集。 你能解释一下事件如何导致C#代码中的内存泄漏,以及如何使用弱引用来解决这个问题,而且没有弱引用?

为什么stdout在redirect到文件时需要显式刷新?

printf()的行为似乎取决于stdout的位置。 如果stdout被发送到控制台,则printf()是行缓冲的,并在打印换行符后被刷新。 如果stdout被redirect到一个文件,除非fflush()被调用,否则缓冲区不会被刷新。 而且,如果在将stdoutredirect到文件之前使用printf() ,则后续写入(对该文件)将被行caching,并在换行之后进行刷新。 什么时候stdout行缓冲,什么时候fflush()需要被调用? 每个的最小示例: void RedirectStdout2File(const char* log_path) { int fd = open(log_path, O_RDWR|O_APPEND|O_CREAT,S_IRWXU|S_IRWXG|S_IRWXO); dup2(fd,STDOUT_FILENO); if (fd != STDOUT_FILENO) close(fd); } int main_1(int argc, char* argv[]) { /* Case 1: stdout is line-buffered when run from console */ printf("No redirect; printed immediately\n"); sleep(10); } int main_2a(int argc, char* argv[]) { /* Case […]

任何人都知道一组用于FFMPEG的C#绑定?

有谁知道一组绑定C#来直接驱动FFMpeg库吗? 我可以直接shell到ffmpeg.exe,但我发现很难同步/控制作为一个单独的进程。 任何帮助将不胜感激。

AppDomain中的静态字段

我正在尝试使用AppDomain来pipe理一些遗留代码,这些代码在multithreading环境中包含大量的静态字段。 我读这个问题的答案: 如何使用AppDomain限制静态类的线程安全使用的范围? ,认为这是相当有前途的,并决定尝试一个非常简单的类在ClassLibrary1.dll中: namespace ClassLibrary1 { public static class Class1 { private static int Value = 0; public static void IncrementAndPrint() { Console.WriteLine(Value++); } } } 这里是我的代码加载组装到2个不同的应用程序域,并调用IncrementAndPrint()几次: var appDomain1 = System.AppDomain.CreateDomain("AppDomain1"); var appDomain2 = System.AppDomain.CreateDomain("AppDomain2"); var assemblyInAppDomain1 = appDomain1.Load("ClassLibrary1"); var assemblyInAppDomain2 = appDomain2.Load("ClassLibrary1"); var class1InAppDomain1 = assemblyInAppDomain1.GetType("ClassLibrary1.Class1"); var class1InAppDomain2 = assemblyInAppDomain2.GetType("ClassLibrary1.Class1"); class1InAppDomain1.InvokeMember("IncrementAndPrint", BindingFlags.Static | […]

用sscanf读空格string

对于一个项目,我试图从string中读取一个int和一个string。 唯一的问题是,当sscanf看到一个空格时,似乎会破坏读取%s。 有没有办法绕过这个限制? 以下是我想要做的一个例子: #include<stdio.h> #include<stdlib.h> int main(int argc, char** argv) { int age; char* buffer; buffer = malloc(200 * sizeof(char)); sscanf("19 cool kid", "%d %s", &age, buffer); printf("%s is %d years old\n", buffer, age); return 0; } 它打印的是“酷十九岁”,我需要“酷十九岁”。 有谁知道如何解决这个问题?

你能编译C#,所以在运行时不需要.NET Framework吗?

是否有可能强制C#编译器将所有引用的调用从框架中取出并打包到dll甚至单个可执行文件中? 我喜欢用C#编写快速的“一次性”应用程序,但是我不希望在目标机器准备好之后将整个框架安装到目标机器上。

Thread.Sleep()的替代方法

每隔N分钟我们就要运行一个任务列表。 所以我们创build了一个任务执行器 do { DoWork(); }while(!stopRequested) 现在我们想在工作周期之间暂停一下。 每个人似乎都认为Thread.Sleep()是魔鬼。 我已经看到提及使用监视/事件的东西,但我们没有其他人告诉我们去做工作。 我们只是想每隔N分钟就像发条一样做东西。 那么有没有其他的select,或者我find了Thread.Sleep的有效使用? 在另一篇文章中有人提到WaitHandle.WaitOne()作为替代,但你不能从一个非静态方法显然调用? 或者至less我不能,因为我得到一个编译时间错误.. 非静态字段,方法或属性“System.Threading.WaitHandle.WaitOne(System.TimeSpan)”需要对象引用