我有一个非托管的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)
{ }
}
我也尝试获取当前进程名称并使用它,但发生了同样的问题。
答案 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所说,不要忽视例外。