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
    }
}