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时动态改名?
要是有以上问题这样做是不是得不偿失 --------------------编程问答--------------------
这种方式可以。
我以前就用这个。
补充:.NET技术 , C#