2012-07-01 85 views
0

因此,我为我的一个项目制作了一个定制的安装程序,我需要的是将所有内容“打包”到一个文件中。 (我不能使用ILMerge或.NETZ,因为我必须包括的其中一件事是非托管的(就是它被称为?)程序集。) 无论如何,我主要从这里读了很多东西,而人们说要这样做:在阅读嵌入式组件(.dll)时遇到的问题

  • 将.dll作为嵌入式资源添加;
  • 向AssemblyResolve方法添加一个处理程序,以便在我的应用程序找不到程序集时触发
  • 在该处理程序中,使用将函数传输到字节数组的函数从内存中加载.dll Assembly.Load()可以使用它。

我做了所有的东西,我添加了一个正常的参考.dll,所以我的代码可以正确编译。但是,当我从应用程序所在的目录中删除.dll文件并尝试运行它时,“无法加载文件或程序集...”对话框(或其它任何东西,你知道我在说什么)弹出并告诉我它无法加载我的.dll,尽管我明确告诉它从AssemblyResolve EventHandler中的该字节数组中加载它。
对不起,如果这是之前已经回答的东西。看看推荐的类似问题,但我看不到这个答案。
我唯一能看到的可能是“C#不允许我从字节加载,除非我处于高度安全的环境中”。如果有人知道任何事情,你能否确认/否认这个声明,并告诉我什么是“高度安全的环境”?我承认,我是一个复杂东西的十月。 :)

在此先感谢您的时间和答案!

回答

1

程序集是托管dll的另一个名称 - 本地dll的最终不会出现在AssemblyResolve位afaik中。我不知道是否有任何其他选项,但在启动时将嵌入式dll保存到磁盘,但我没有找到一个选项告诉操作系统(负责加载非托管dll)如何找到嵌入式dll。

+0

“native”dll等于“managed”dll,是这样吗?哦,这里的用户说过关于安全上下文的事情也表示,如果程序集流式传输到磁盘上,然后使用'Assembly.Load(filename);'从那里加载,那么它就不会有问题。我会给这个方法一个镜头,我们会看到...... – Lumos

+0

“托管”,在这种情况下,“组装”是.NET的dll的。 “非托管”和“本地”是非.NET dll的。术语“本地”意味着dll不能用于不同的平台,而.NET dll不是平台特有的。 –

+0

@ C.Evenhuis dll的位置应该位于Environment PATH变量或应用程序运行位置。寻找操作系统尝试搜索dll的位置的最佳方法是使用sysinternal的ProcMon(http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx),通过监视应用程序的文件读/写活动处理。 –