C# 将嵌入式 DLL 复制到用户文件夹
C# copy embedded DLL to User Folder
我有一个 C# WinForms 应用程序,需要将嵌入式 DLL 文件复制到用户目录。
我无法让我的应用程序识别嵌入式 DLL 文件。有人可以帮忙吗?
系统不断抛出异常参数“eContactAutoCAD.dll 不存在”——显然变量为空。
我需要更改什么才能让系统识别嵌入的文件?
namespace eContact_AutoCAD_Installer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const string dllFolder = @"C:\eContact\";
const string dllFile = @"C:\eContact\eContactAutoCAD.dll";
const string EMBED_DLLFILE = "eContact_AutoCAD_Installer.Files.eContactAutoCAD.dll";
/*
---
*/
//Copy DLL to User's "C:/eContact/" folder
private static void copyDLL()
{
if (!Directory.Exists(dllFolder))
{
Directory.CreateDirectory(dllFolder);
}
try
{
using (Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(EMBED_DLLFILE))
{
if (resource == null)
{
throw new ArgumentException("eContactAutoCAD.dll does not exist");
}
using (Stream output = File.OpenWrite(dllFile))
{
resource.CopyTo(output);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
/*
---
*/
}
}
此示例代码应涵盖主要问题。
添加文件时,将其设置为嵌入式资源,以便文件包含在最终的 exe 中:
访问资源时,包括文件所在的命名空间和文件夹。还使用 MemoryStream 访问文件,因为它是二进制数据。
private int copyDLL()
{
var resourceName = "WinFormsApp2.Files.SomeFile.dll"; // resource starts with namespace, then folder name
MemoryStream ms = new MemoryStream(); // buffer for file bytes
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) // open resource
{
stream.CopyTo(ms); // copy to buffer
byte[] bb = ms.ToArray(); // need array to save
File.WriteAllBytes(@"C:\tmp\SomeFile2.dll", bb); // save byte array to file
return bb.Length; // return file size
}
}
我有一个 C# WinForms 应用程序,需要将嵌入式 DLL 文件复制到用户目录。 我无法让我的应用程序识别嵌入式 DLL 文件。有人可以帮忙吗?
系统不断抛出异常参数“eContactAutoCAD.dll 不存在”——显然变量为空。
我需要更改什么才能让系统识别嵌入的文件?
namespace eContact_AutoCAD_Installer
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
const string dllFolder = @"C:\eContact\";
const string dllFile = @"C:\eContact\eContactAutoCAD.dll";
const string EMBED_DLLFILE = "eContact_AutoCAD_Installer.Files.eContactAutoCAD.dll";
/*
---
*/
//Copy DLL to User's "C:/eContact/" folder
private static void copyDLL()
{
if (!Directory.Exists(dllFolder))
{
Directory.CreateDirectory(dllFolder);
}
try
{
using (Stream resource = Assembly.GetExecutingAssembly().GetManifestResourceStream(EMBED_DLLFILE))
{
if (resource == null)
{
throw new ArgumentException("eContactAutoCAD.dll does not exist");
}
using (Stream output = File.OpenWrite(dllFile))
{
resource.CopyTo(output);
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
}
/*
---
*/
}
}
此示例代码应涵盖主要问题。
添加文件时,将其设置为嵌入式资源,以便文件包含在最终的 exe 中:
访问资源时,包括文件所在的命名空间和文件夹。还使用 MemoryStream 访问文件,因为它是二进制数据。
private int copyDLL()
{
var resourceName = "WinFormsApp2.Files.SomeFile.dll"; // resource starts with namespace, then folder name
MemoryStream ms = new MemoryStream(); // buffer for file bytes
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) // open resource
{
stream.CopyTo(ms); // copy to buffer
byte[] bb = ms.ToArray(); // need array to save
File.WriteAllBytes(@"C:\tmp\SomeFile2.dll", bb); // save byte array to file
return bb.Length; // return file size
}
}