如果编译后program.exe名称更改,则无法加载资源

时间:2016-11-30 02:37:01

标签: c#

我有一个非托管的DLL,所以我写这个是为了在程序运行后将dll保存到文件中。

工作代码:

public static void ExtractResourceToFile()
{
    if (!File.Exists("loader.dll"))
        try
        {

            using (System.IO.FileStream fs = new System.IO.FileStream("loader.dll", System.IO.FileMode.Create))
                System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("Kraken.Resources.loader.dll").CopyTo(fs);
                Thread.Sleep(5000);

        }       
        catch ( Exception ex)
        { }
}

问题:

如果已编译的Kraken.exe名称已更改,则表示未保存DLL。

我尝试了什么:

public static void ExtractResourceToFile()
{
    if (!File.Exists("loader.dll"))
        try
        {
            string file = System.Reflection.Assembly.GetExecutingAssembly().Location;;
            string app = System.IO.Path.GetFileNameWithoutExtension(file);
            using (System.IO.FileStream fs = new System.IO.FileStream(file, System.IO.FileMode.Create))
                System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(app + ".Resources.loader.dll").CopyTo(fs);
                Thread.Sleep(5000);

        }       
        catch ( Exception ex)
        { }
}

我也尝试获取当前进程名称并使用它,但发生了同样的问题。

1 个答案:

答案 0 :(得分:0)

看到这个: How do I get the name of the current executable in C#?

特别是这些评论很有意思:

  

小心GetExecutingAssembly():如果你从库中调用它   程序集,它返回库程序集的名称,即   不同于入口组件的名称(即原件   可执行文件)。如果使用GetEntryAssembly(),则返回该名称   实际可执行文件,但如果进程是,则抛出异常   在WCF下运行(诚然是一种罕见的情况)。对于最强大的   代码,使用Process.GetCurrentProcess()。ProcessName。 - Contango 11月3日   ' 10在12:01

     

嗯,请注意,即使您重命名,返回的字符串也不会发生变化   使用文件资源管理器手动执行可执行文件。而   Environment.GetCommandLineArgs()[0]随实际变化而变化   可执行文件名(当然)。巧合的是,第二种方法   因为我想要数据文件夹,所以我的具体情况更好   被命名为实际的可执行文件名。 - Hatoru Hansou 1月23日&14; 14   在2:25

Hatoru的评论似乎支持Phil1970的评论,GetExecutingAssembly()可能使用在程序集中找到的资源属性而不是实际的文件名。

所以我使用

  

Process.GetCurrentProcess()。ProcessName

正如Contango建议的那样。

正如zerkms所说,不要忽视例外。