C# 如何辨别DLL';s Mono/Gtk应用程序取决于(Windows)

C# 如何辨别DLL';s Mono/Gtk应用程序取决于(Windows),c#,windows,mono,gtk#,C#,Windows,Mono,Gtk#,我有一个在windows上运行的简单gtk#mono应用程序。它在安装了Mono、.NET和GTK的PC上运行良好。但是如果我把exe给一个朋友,它显然不起作用 Mono的mkbundle工具似乎无法在windows上正常工作,这会带来很多麻烦(我已经尝试过)。因此,我回到了快速解决方案,在给朋友时,只在exe中包含必要的DLL 但我不知道需要什么。到目前为止,我的猜测是错误的。我试着包含mkbundle想要嵌入的所有内容,但没有成功。有什么工具可以告诉我需要什么吗?创建一个新的控制台项目(示例

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

Mono的mkbundle工具似乎无法在windows上正常工作,这会带来很多麻烦(我已经尝试过)。因此,我回到了快速解决方案,在给朋友时,只在exe中包含必要的DLL


但我不知道需要什么。到目前为止,我的猜测是错误的。我试着包含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);
        }
    }
}
使用系统;
运用系统反思;
命名空间检查
{
班级计划
{
静态void Main(字符串[]参数)
{
if(args.Length<1 | | string.IsNullOrEmpty(args[0]))
{
WriteLine(“此程序需要指向可执行文件路径的参数。”);
Console.WriteLine(“示例:”);
Console.WriteLine(Path.GetFileName(Assembly.GetEntryAssembly().Location)+@“c:\Path\To\Executable.exe”);
Console.ReadKey(true);
返回;
}
如果(!File.Exists(args[0]))
{
WriteLine(“未找到文件”);
Console.ReadKey(true);
返回;
}
Assembly asm=Assembly.LoadFile(args[0]);
foreach(asm.getReferenceAssemblys()中的AssemblyName asmName)
{
Console.WriteLine(asmName.FullName);
}
Console.ReadKey(true);
}
}
}
编译它,然后使用以下命令调用它:

InspectRefAssm.exe“Path\To\YourExecutable.exe”


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

如果您要分发用Gtk#/Mono制作的程序,那么您需要您的朋友来安装。安装后,只需复制并执行exe,即可完成。

此应用程序运行良好,我将DLL包含在应用程序中,并将其交给了我的朋友。但该应用程序仍然无法运行。他电脑上有.NET。他也需要单核细胞增多症吗?我认为这不对。这里说Gtk需要单声道是一种常见的误解。遗憾的是,它仍然不能解决我的问题。是的,我已经把它整理好了,谢谢你的帮助,尽管从技术上讲,这不是我问的问题。我给了你一票。那可能是因为你的问题比它需要的更复杂。。。我的意思是,如果您使用Gtk,请安装Gtk-)这不仅仅是DLL的问题,因为您需要C#的DLL,然后是本地的Gtk DLL。所以这不是一件简单的事,说得对。当引用的程序集不能自己工作时,我意识到了这一点。我感谢你的帮助。