我有一个 .NET 6 WPF 项目,无法弄清楚发生了什么变化,因为ProductVersion我的程序集突然包含 git commit 哈希。
我的项目文件总是这样,我还更新了版本信息:
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows</TargetFramework>
<UseWPF>true</UseWPF>
...
<Version>0.9.2</Version>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
然后,在我的代码中,我使用以下命令将版本获取为字符串:
string? productVersion = FileVersionInfo.GetVersionInfo(Assembly.GetEntryAssembly()!.Location).ProductVersion;
Run Code Online (Sandbox Code Playgroud)
这总是返回预期的版本,例如0.9.2,与项目文件中设置的版本完全相同。但有些事情发生了变化,现在看起来像这样:0.9.2+abf5b643b64475a8b1d7d89284e3478b1ba4a431。这也是显示在资源管理器中 .dll 和 .exe 文件的“详细信息”选项卡上的内容。
我会定期更新 Visual Studio,以便接收我在其他项目中使用的 .NET 8 的更新,因此它可能与某些更新有关。但我不知道究竟发生了什么变化,也不知道如何定义ProductVersion不包含 git 提交哈希(是的,它是提交哈希)。也有一段时间没有参与 WPF 项目了,所以不知道这种行为何时改变。
讽刺的是,我过去需要 git 提交,所以必须付出一些额外的努力才能使其可用,尽管缩写为 8 个字符。
有任何想法吗?
我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.
#define LIST_HEAD(a) { int a = 0; }
#include <sys/queue.h>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
#include <sys/queue.h>
#define LIST_HEAD(a) { int a = 0; }
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这两种情况都能产生警告,因为没有任何检查<sys/queue.h>会阻止重新定义.
那么为什么第一种情况不产生警告,而第二种情况呢?我在这里缺少什么?
顺便说一句:我在Mac上用clang和我的Linux机箱用gcc得到了相同的结果.
当我发现我已经使用了一段时间的匿名结构实际上只能在C11中使用,而不是C99时,我正在对我的项目进行编码,这是我想编写的标准.
给出以下代码:
struct data {
int a;
struct {
int b;
int c;
};
};
int main()
{
struct data d;
d.a = 0;
d.b = 1;
d.c = 2;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
此代码应仅在C11中编译(或者如果编译器扩展提供此功能并且已启用).那么让我们看看不同编译器的结果:
compiler:
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.1.0
Thread model: posix
command:
clang -std=c99 -Wall test.c -o test
result:
**OK**
Run Code Online (Sandbox Code Playgroud)
compiler:
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-54)
command:
gcc -std=c99 -Wall test.c -o test
result:
**NOT OK**
test.c:6: …Run Code Online (Sandbox Code Playgroud) 我想明白:
char[1]在C中使用char*(为什么这样做?)和提供以下示例程序:
#include <stdio.h>
#include <string.h>
struct test_struct {
char *a;
char b[1];
} __attribute__((packed)); ;
int main() {
char *testp;
struct test_struct test_s;
testp = NULL;
memset(&test_s, 0, sizeof(struct test_struct));
printf("sizeof(test_struct) is: %lx\n", sizeof(struct test_struct));
printf("testp at: %p\n", &testp);
printf("testp is: %p\n", testp);
printf("test_s.a at: %p\n", &test_s.a);
printf("test_s.a is: %p\n", test_s.a);
printf("test_s.b at: %p\n", &test_s.b);
printf("test_s.b is: %p\n", test_s.b);
printf("sizeof(test_s.b): %lx \n", sizeof(test_s.b));
printf("real sizeof(test_s.b): %lx \n", ((void *)(&test_s.b) - (void *)(&test_s.a)) ); …Run Code Online (Sandbox Code Playgroud) 我正在寻找有关如何在我的库中透明和明智地处理对大型(由大于可寻址内存定义)文件/块设备的访问的帮助.假设我们在32位架构上拥有512GB大小的块设备.512GB是我们在32位架构上解决的问题,在内存中管理部分设备/文件mmap()是我想要避免的.
我想要实现的是,获取被解析为64位数字/偏移的块,并且这些块是任意的但是每个设备的静态大小(512字节,4K,8K,64MB等).调用者应该只获取内存地址,不需要注意释放内存或将实际内容加载到内存中.
我在考虑如下机制:
void* get_file_address(unit64_t blk_offset)调用偏移量(块号)并检查是否已映射此块并且是否已读入并因此映射它get_file_address调用时更新)最后一点让我感到恼火:自己写一个记忆管理员似乎并不理智.另外,我确信我不是第一个遇到这个问题的人.
那么有没有任何解决方案/库/代码片段已经有助于管理这样或类似的情况?我对Win,Linux,*BSD或OS X的解决方案没问题.
所以我使用CoreOS手册安装指南中的Kubernetes启动并运行了kubernets集群.
$ kubectl get no
NAME STATUS AGE
coreos-master-1 Ready,SchedulingDisabled 1h
coreos-worker-1 Ready 54m
$ kubectl get cs
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
etcd-2 Healthy {"health": "true"}
etcd-1 Healthy {"health": "true"}
$ kubectl get pods --all-namespaces -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
default curl-2421989462-h0dr7 1/1 Running 1 53m 10.2.26.4 coreos-worker-1
kube-system busybox 1/1 Running 0 55m 10.2.26.3 coreos-worker-1
kube-system kube-apiserver-coreos-master-1 1/1 Running 0 …Run Code Online (Sandbox Code Playgroud)