V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hahade
V2EX  ›  问与答

开发 Windows 控制台程序,是选择 Go 还是 C#?

  •  
  •   hahade · 281 天前 · 2981 次点击
    这是一个创建于 281 天前的主题,其中的信息可能已经有所发展或是发生改变。

    目前我准备开发一个稍微有一点复杂的 Windows 控制台程序,但是不知道如何选择合适的编程语言,我目前了解到的如下:

    C#

    • 很久之前学过,对于语法了解一些
    • 依赖运行时环境,比如:.NET Framework 4.x
    • 容易被反编译

    Go

    • 刚了解,语法不熟悉,但是感觉还不错
    • 不依赖运行时
    • 无法被反编译

    其它

    • 我需要调用 Win32 API ,不知道这两种语言哪个更方便一些
    • .NET 我只对于 .NET Framework 了解一点,.NET Core 不懂

    先感谢大家帮我分析一下!

    41 条回复    2024-03-14 15:28:34 +08:00
    cat007
        1
    cat007  
       281 天前
    Go 不了解,调用 Win32API 用 C#更方便吧,另外 C#代码可以混淆防止被反编译
    LongMaoz
        2
    LongMaoz  
       281 天前
    .net 语法比 go 友好一点 不需要自行处理指针
    如果是稍微有点复杂,建议直接使用.net
    hahade
        3
    hahade  
    OP
       281 天前
    @cat007 主要是不想花时间在反编译上面。
    helone
        4
    helone  
       281 天前
    这俩语言其实都能满足,更多是看你熟悉哪个,C#开发肯定坑相对较少,Go 在 Windows 下还是有不少的问题的
    0o0O0o0O0o
        5
    0o0O0o0O0o  
       281 天前 via iPhone
    > 容易被反编译
    > 无法被反编译

    否,只是分析难度不同。我认为真需要保护的话也不可能指望这种难度区别,C# 有商业化的保护,Go 据我所知是没有,只有功能有限且用起来略麻烦的开源混淆工具。

    > 依赖运行时环境

    https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot/

    > 需要调用 Win32 API

    那肯定 C# 方便
    hahade
        6
    hahade  
    OP
       281 天前
    @LongMaoz 感谢,没想到 Go 还有指针这东西。
    hahade
        7
    hahade  
    OP
       281 天前
    @helone 感谢!
    hahade
        8
    hahade  
    OP
       281 天前
    @0o0O0o0O0o 感谢,AOT 我还是第一次听说,有机会了解一下。
    ZZ74
        9
    ZZ74  
       281 天前 via Android
    都是虚拟机语言 go 怎么就不依赖运行时了。。。
    反倒是 c #,现在 win 一般自带一个 net 运行时,更便捷
    hahade
        10
    hahade  
    OP
       281 天前
    @ZZ74 目前对于 Go 只是在网上了解了一下,感谢!
    Jirajine
        11
    Jirajine  
       281 天前
    现在这个时代,没有什么代码有被逆向的价值。反编译保护几乎是 malware only 的需求。
    idealhs
        12
    idealhs  
       281 天前   ❤️ 1
    肯定选 C#了,时代变了 C#非常现代化,并且写 Windows Console 的话没啥更好的选择
    .NET 8 不依赖.NET Framework,控制台程序可以 AOT 编译,不存在反编译的可能性
    .NET 也更容易调用 Win32 API
    beyondex
        13
    beyondex  
       281 天前
    你对 C# 的认知停留在多年以前。。。
    1. .NET Core 可以发不成不依赖运行时的 self contained 版本,比如这个复杂的桌面搜索程序 https://seadesktopsearch.com/
    2. AOT 就不怕反编译,而且体积也比较小
    3. 不 AOT 又不想被反编译,可用混淆工具混淆或加密,比如 Dotfuscator (做混淆的,有免费版也有付费版)、DNGuard 虚拟机壳等。
    hahade
        14
    hahade  
    OP
       281 天前
    @idealhs 感谢!
    hahade
        15
    hahade  
    OP
       281 天前
    @beyondex 确实,我只记得当初学 .NET Framework 3.5 的时候学的 C#。
    shilyx
        16
    shilyx  
       281 天前
    go 的话用 win32 api 本来挺费劲的,但这些活早就有人干了,例如

    https://github.com/zzl/go-win32api

    c#的也有类似的库
    jstony
        17
    jstony  
       281 天前
    op 可以了解一下.net 8 的 aot 机制,另外写 win console 我觉得没用比 c#更方便快捷的了。
    DTCPSS
        18
    DTCPSS  
       281 天前
    C# AOT 或者 Rust
    hahade
        19
    hahade  
    OP
       281 天前
    @shilyx 调用 Win32 可痛苦了,我一直在想为啥微软不出一个 C# 版的 Win32 API ,有时候要写一大堆的声明。
    hahade
        20
    hahade  
    OP
       281 天前
    @jstony 感谢,我想我很有必要重新学一下最新版的 .NET 。
    ysc3839
        21
    ysc3839  
       281 天前 via Android
    没法推荐,得看程序是做什么的
    lslqtz
        22
    lslqtz  
       281 天前
    C# 坑少, Go 跨平台.
    ysc3839
        23
    ysc3839  
       281 天前 via Android
    @hahade 微软有出“C# 版的 Win32 API”
    https://github.com/microsoft/CsWin32
    Biggoldfish
        24
    Biggoldfish  
       281 天前
    容易被反编译/无法被反编译

    绝大多数代码扔 GitHub 上请我看我都懒得看,除非是不正经的需求不然哪有那么多反编译的需求
    hahade
        25
    hahade  
    OP
       281 天前
    @ysc3839 感谢!
    hahade
        26
    hahade  
    OP
       281 天前
    @Biggoldfish 哈哈,确实是。
    fgwmlhdkkkw
        27
    fgwmlhdkkkw  
       281 天前
    如果依赖反射的话,就别用 go ,tag 反人类
    Rehtt
        28
    Rehtt  
       281 天前 via Android
    @shilyx 这个库热度高一点 https://github.com/lxn/win
    wWjd5V5L0636B5YV
        29
    wWjd5V5L0636B5YV  
       281 天前
    @hahade #6 😱😱😱
    FreeGuy
        30
    FreeGuy  
       281 天前
    都标注了 Windows 了,既然都是 Windows 还要啥 Console 程序,直接上 Winforms 或者 Delphi VCL :)
    hahade
        31
    hahade  
    OP
       281 天前 via Android
    @FreeGuy 我要做的这个功能不需要界面,只需要一个控制台就可以了。主要是看哪个方便一些,并且能够集成 win32api 就更好了。
    oyjc
        32
    oyjc  
       281 天前
    如果哪一天你的需求变更了,需要 GUI 了,C# 就更方便了
    FreeGuy
        33
    FreeGuy  
       281 天前
    @hahade Windows 上的开发肯定是 VCL 最方便,控制台玩的人少!
    FreeGuy
        34
    FreeGuy  
       281 天前
    玩控制台不用思考了,直接上 Golang ,毫无悬念的选择,Windows 上做开发的都是玩可视化,控制台世界和可视化是两个世界,Golang 属于控制台世界!
    hahade
        35
    hahade  
    OP
       281 天前
    @FreeGuy 谢谢!
    ugpu
        36
    ugpu  
       281 天前
    没有理由的 C#
    简单点 你要去读书: C#是校长的亲儿子 全力支持的那种
    FreeGuy
        37
    FreeGuy  
       281 天前
    Golang 已经在过去几年经过了非常多大厂的实践,在控制台世界非常成熟了,以云原生社区 K8S 生态为代表;反观 Delphi/C# 生态更多还是可视化多,主要是 ToC ,服务端虽然也有人做开发,但解决方案的生态远远没法与云原生生态比较,毕竟背后一堆大厂背书,而 C# 几乎只有微软,我说的是服务端领域,请网友看清楚再喷哦!另外,尽管有 AOT 编译问世提高运行效率,但在服务端领域生产实践还需要一些时间,当然包括 Java 在内;云原生时代之后改变的东西太多了,当然现在 C# 无疑是 ToC 的王者,以 Unity 作为代表!
    andytao
        38
    andytao  
       280 天前
    推荐你一个非常赞的原生组合:Vala + GLib + MSYS2 + VSCode
    shilyx
        39
    shilyx  
       280 天前
    @hahade C# 的理想不在于此,不能同 win32 api 深度绑定。总有一天要面对其他平台的
    Al0rid4l
        40
    Al0rid4l  
       280 天前
    需要调用 Win32 API

    就这一条就 C# 吧, 另外别 .NET Framework 了, 现在直接 .NET8
    hahade
        41
    hahade  
    OP
       280 天前
    @Al0rid4l 这个太超前了,准备买本书重学一下 .NET ,也不知道对 Win7 支持得怎么样。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3046 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 13:20 · PVG 21:20 · LAX 05:20 · JFK 08:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.