如何判断 Mono/Gtk# 应用程序依赖的 DLL (Windows)

How to tell what DLL's a Mono/Gtk# app depends on (Windows)

我在 windows 上有一个简单的 gtk# mono 应用程序 运行。它在我安装了 Mono、.NET 和 GTK 的 PC 上运行良好。但是如果我把exe给朋友,显然是行不通的。

Mono 的 mkbundle 工具似乎无法在 windows 上正常工作(我试过)。所以我已经恢复到快速解决方案,即在将它提供给朋友时将必要的 DLL 包含在 exe 中。

但我不知道需要什么。到目前为止,我的猜测都是错误的。我尝试包括 mkbundle 想要嵌入的所有内容,但这没有用。有什么工具可以告诉我我需要什么吗?

创建一个新的控制台项目(示例名称 InspectRefAssm),将其粘贴到其中:

using System;
using System.Reflection;

namespace InspectRefAssm
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length < 1 || string.IsNullOrEmpty(args[0]))
            {
                Console.WriteLine("This program requires an argument to the path of the executable.");
                Console.WriteLine("Example:");
                Console.WriteLine(Path.GetFileName(Assembly.GetEntryAssembly().Location) + @" c:\Path\To\Executable.exe");
                Console.ReadKey(true);
                return;
            }

            if (!File.Exists(args[0]))
            {
                Console.WriteLine("File not found.");
                Console.ReadKey(true);
                return;
            }

            Assembly asm = Assembly.LoadFile(args[0]);

            foreach (AssemblyName asmName in asm.GetReferencedAssemblies())
            {
                Console.WriteLine(asmName.FullName);
            }

            Console.ReadKey(true);
        }
    }
}

编译它,然后调用它:

InspectRefAssm.exe "Path\To\YourExecutable.exe"

这使用反射来确定可执行文件引用的库。如果您有多个文件是可执行文件的一部分,您可能需要为每个文件 运行 这样做,或者您可以将其修改为递归的,我将把它作为练习留给您。

如果您要分发使用 Gtk#/Mono 制作的程序,则需要您的朋友安装 Gtk# for Windows。安装完成后,只需复制并执行exe,就大功告成了。