小编gra*_*hel的帖子

FileVersionInfo.ProductVersion 突然包含 git commit hash

我有一个 .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 个字符。

有任何想法吗?

.net c# .net-6.0 .net-8.0

26
推荐指数
1
解决办法
3060
查看次数

C预处理器重新定义依赖于包含顺序的冲突

我刚刚在我正在进行的项目中有一次重新定义的冲突,并且在追踪为什么它没有在所有平台上发生(原来是按包含顺序)时,我偶然发现了以下无法解释的行为.

1.没有警告地编译

    #define LIST_HEAD(a) { int a = 0; }                                                                                                                     
    #include <sys/queue.h>                                                          

    int main() {                                                                    
        return 0;                                                               
    }
Run Code Online (Sandbox Code Playgroud)

2."宏重新定义"警告

    #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得到了相同的结果.

c redefine c-preprocessor

12
推荐指数
1
解决办法
505
查看次数

强制编译器符合C99标准

当我发现我已经使用了一段时间的匿名结构实际上只能在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中编译(或者如果编译器扩展提供此功能并且已启用).那么让我们看看不同编译器的结果:

铿锵5

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)

gcc 4.1

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)

c gcc c99 clang c11

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

C char数组作为指针

我想明白:

  • 为什么会发生这种情况,有时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)

c arrays pointers

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

大文件内存管理

我正在寻找有关如何在我的库中透明和明智地处理对大型(由大于可寻址内存定义)文件/块设备的访问的帮助.假设我们在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的解决方案没问题.

c memory mmap file

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

kubernetes服务IP无法访问

所以我使用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)

coreos kubernetes

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

标签 统计

c ×4

.net ×1

.net-6.0 ×1

.net-8.0 ×1

arrays ×1

c# ×1

c-preprocessor ×1

c11 ×1

c99 ×1

clang ×1

coreos ×1

file ×1

gcc ×1

kubernetes ×1

memory ×1

mmap ×1

pointers ×1

redefine ×1