当前位置:编程学习 > C#/ASP.NET >>

200分经验性问题: dll文件作为资源嵌入到程序集中 怎样将其释放出来呢??? 知道的朋友请进来看看 里面有详细说明

C# WinForm里:
 原先: 我做了个程序叫MyExe  在程序中我引用了别人写的一个MyDll.dll   是这样引用的 而且没有错误:
   [DllImport("MyDll.dll", EntryPoint = "wlDeletry")]
   public static extern int Deletry(int wnd, int vk, int sheck, int Dele);
   MyDll.dll也放在与MyExe.exe同一个目录下  最后生成了一个MyExe.exe 可以执行
    但如果把这个MyDll.dll删了或者移除  程序就报错 说无法引用MyDll.dll 
   
   为了避免这个问题,我在想办法 怎样把这个别人写的MyDll.dll合成到我的MyExe.exe里面 
   
   有朋友建议我用资源  即将这个MyDll.dll作为资源放到程序集里面  可我不知道放进去后怎么修改上面那段[DllImport..]
  的代码   也就是我不知道怎么在程序中引用所添dll资源里的方法(因为我要用MyDll.dll里的Deletry(....)方法的呀)

  或者换种想法也可以 即我在程序中将MyDll.dll添加到程序集中作为资源 然后在程序中 当MyExe里Form1.load的时候就将这个dll资源释放到和MyExe.exe相同的目录下  这样就可以用我原来那个[DllImport]来引用了 当程序结束之前再让这个释放出来的dll消失就行了  这样也行  但我不知道怎样将这个dll资源释放出来 这是关键  我以前释放过其他资源如BMP、WAV等文件
 dll文件作为资源释放出来  我不会   比如 我以前用樱花草.wav作为资源嵌入到exe里  是这样释放的:

using System.IO;
UnmanagedMemoryStream ums = Properties.Resources.樱花草;  //已经将樱花草.wav作为资源嵌入到程序集了
                byte[] xss = new byte[(int)ums.Length];
                ums.Read(xss, 0, (int)ums.Length);
                FileStream fs = new FileStream("樱花草.wav", FileMode.Create);
                fs.Write(xss, 0, xss.Length);
                fs.Flush();
                fs.Dispose();
但我如果用dll嵌入到程序集里  就不能用UnmanagedMemoryStream加FileStream将它释放出来了 您也可以试一下   
 很疑惑   
   
哪位朋友知道怎么实现的  请千万教教小弟啊   
小弟对非托管方面了解还不是很多  如果可以的话 可以提供些codes 让小弟参考
分不怎么多 如果需要的话  可以再加100分的  问题解决立马给分

 过来的朋友都帮忙顶一下  好么     谢谢各位!!!
  
   
--------------------编程问答--------------------
不用Code

1. Add Existing Item - Add your unmanaged dll
2. Set it as Content
3. Set “Copy to Output Directory" - ”Copy if newer“
4. In your installer project, make sure to include content files
--------------------编程问答-------------------- 不太明白楼上的意思  
up --------------------编程问答-------------------- 上面的方法好象不行唉   .. --------------------编程问答-------------------- 就将数据读出再写到文件吧

System.IO.Stream fs = GetType().Assembly.GetManifestResourceStream("Project_name.mydll.dll");
FileStream fs2 = File.Create(@"mydll.dll");
BinaryReader binReader = new BinaryReader(fs);

fs2.Write( binReader.ReadBytes((int)fs.Length),0,(int)fs.Length );

binReader.Close();
fs.Close();
fs2.Close();
--------------------编程问答-------------------- 有知道的朋友么? --------------------编程问答-------------------- UnmanagedMemoryStream;Properties.Resources.樱花草;是什么来的?

我用GetType().Assembly.GetManifestResourceStream("Project_name.mydll.dll"); 可以啊,和其它文件类型没什么不同。

再不行后序改名不就得了吗 --------------------编程问答-------------------- 帮顶...... --------------------编程问答-------------------- 动态调用,不使用[DllImport("MyDll.dll", EntryPoint = "wlDeletry")] 
用LoadLibrary,GetProcAddress --------------------编程问答-------------------- 这种方式:

用ILMerge.exe将dll合并到exe中 --------------------编程问答-------------------- 对dll不懂 --------------------编程问答-------------------- 动态调用可以看我的这个:
http://blog.csdn.net/null1/archive/2009/03/03/3953155.aspx

然后不使用DllImport就差不多了。 --------------------编程问答-------------------- 帮顶 --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 楼主是引用了一个Dll文件,又不想看到看到它,删了程序运行出错,就想把Dll藏在可执行文件里,需要用的时候再放出来,退出程序的时候再删掉,是这意思吧?
想法新奇,思维大胆,我试验一下看有什么方法 --------------------编程问答-------------------- 弱弱地问一下,要是我同时运行两个实例时会不会控制起来很麻烦?
生成2个DLL?
释放时还得看这个Dll是否被调用?或者生成DLL和调用DLL时动态改名?
要是有以上问题这样做是不是得不偿失 --------------------编程问答--------------------
引用 9 楼 yeaicc 的回复:
这种方式:

用ILMerge.exe将dll合并到exe中


这种方式可以。

我以前就用这个。
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,