包含 Windows API 方法签名、结构、常量的大型 C# 源文件:它们都会包含在最终的 .exe 中吗?

发布于 2024-10-05 08:43:48 字数 758 浏览 4 评论 0原文

我想将我在程序中使用的 Windows API 函数的所有签名放在一个类(例如 WinAPI)中,并将其放在我将包含在我的项目中的文件 WinAPI.cs 中。该类将是内部静态,方法将是公共静态外部。 (类似于 .NET Framework 源代码中巨大的 NativeMethods.cs)。

假设 WinAPI.cs 有一百个本机方法签名,例如:

[DllImport("user32.dll")]
internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  1. 如果我只想在项目中使用其中的几个(甚至一两个),如果我在项目中包含 WinAPI.cs 文件,最终的 .exe 是否会填充我没有使用的不必要的方法声明(其他 99 个左右)?

  2. 原生结构声明怎么样,如果我不在当前项目中使用它们,它们是否仍会包含在最终的 .exe 中?

     [StructLayout(LayoutKind.Sequential)]
        公共结构点
        {
            公共 int X;
            公共 int Y;
        }
    
  3. 常量声明或只读成员怎么样:

    public const int WH_JOURNALPLAYBACK = 1;
    公共静态只读 int WM_GETTEXT = 0x0D;
    

I want to put all the signatures of Windows API functions I'm using in programs in one class, such as WinAPI, and in a file WinAPI.cs I will include in my projects. The class will be internal static and the methods public static extern. (Something like the huge NativeMethods.cs from the .NET Framework source code).

Let's say WinAPI.cs has one hundred native methods signatures like:

[DllImport("user32.dll")]
internal static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  1. If I'm only going to use a few of them in a project (even one or two), if I include the WinAPI.cs file in my project, will the final .exe be filled with the unnecessary method declarations I'm not using (the other 99 or so)?

  2. What about native structure declarations, If I'm not using them in the current project, will they still be included in the final .exe?

        [StructLayout(LayoutKind.Sequential)]
        public struct POINT
        {
            public int X;
            public int Y;
        }
    
  3. What about constants declarations or readonly members like:

    public const int WH_JOURNALPLAYBACK = 1;
    public static readonly int WM_GETTEXT = 0x0D;
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

画中仙 2024-10-12 08:43:49

不要为这里的小事担心。这些只是声明,最终汇编中没有它们的 IL。它们只是占用元数据中的一些空间。它们甚至没有从程序集中加载的可能性非常高,尤其是当您将声明放在一起时。元数据仅在使用时才加载到 RAM 中,一次 4096 字节。

顺便说一句,您明确不想对这些常量声明使用只读。现在你确实让它们占据空间,即使它们没有被使用。公共常量是个好主意的少数情况之一。这些是明显的常数,它们的值永远不会改变。就像Math.PI一样。

Don't sweat the small stuff here. These are just declarations, there is no IL for them in the final assembly. They just take up some space in the metadata. Odds are very high that they don't even get loaded from the assembly, especially when you keep the declarations together. Metadata is only ever loaded into RAM when it is used, 4096 bytes at a time.

Btw, you explicitly don't want to use readonly for these constant declarations. Now you do get them to take space, even when they are not used. One of the few cases where a public const is a good idea. These are manifest constants, their value never changes. Like Math.PI.

后知后觉 2024-10-12 08:43:49

所有这些都将包括在内。但是,它将作为 IL 包含在内,并且当程序运行时,它只是编译后的机器代码。我们谈论的空间最多可能是 40K。

All of this will be included. However, it will be included as IL and when the program runs it's just compiled machine code. We're talking maybe 40K of space at most.

旧时模样 2024-10-12 08:43:49

您所陈述的所有元素都将包含在最终组装中。
从最终 exe 文件中删除它们的唯一方法是使用预编译指令。
例如:

<前><代码>#if EXCLUDE_METHODS

//此处未使用的方法

<前><代码>#endif

All elements which you have stated will be included in final assembly.
The only way to get rid of them from final exe file is precompilation directives usage.
For example:

#if EXCLUDE_METHODS

//unused methods here

#endif
牛↙奶布丁 2024-10-12 08:43:49

如果我只使用其中的几个
在一个项目(即使是一两个)中,如果我
将 WinAPI.cs 文件包含在我的
项目,最后的.exe会被填吗
用不必要的方法
我没有使用的声明(其他
99左右)?

是的,项目中的所有代码都将被编译到程序集中;

原生结构怎么样
声明,如果我不使用它们
目前的项目,他们还会
包含在最终的 .exe 中吗?

是的。他们也将被包括在内。

 常量声明或只读成员怎么样:

是的。他们也将被包括在内。

If I'm only going to use a few of them
in a project (even one or two), if I
include the WinAPI.cs file in my
project, will the final .exe be filled
with the unnecessary method
declarations I'm not using (the other
99 or so)?

Yes, all code in your project will be compiled into your assembly;

What about native structure
declarations, If I'm not using them in
the current project, will they still
be included in the final .exe?

Yes. They will be included too.

   What about constants declarations or readonly members like:

Yes. They will be included too.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文