你知道,我在任何地方都没有看到一个好的答案.是否可以将预先存在的DLL嵌入到已编译的C#可执行文件中(这样您只能分发一个文件)?如果有可能的话,怎么去做呢?
通常情况下,我很酷,只是将DLL放在外面并让安装程序处理所有内容,但是有几个人在工作,他们问我这个,老实说我不知道.
我有一个使用DLLImport使用非托管C++ DLL的托管C#dll.一切都很好.但是,我想在我的托管DLL中嵌入非托管DLL,如Microsoft解释:
所以我将非托管dll文件添加到我的托管dll项目,将属性设置为'Embedded Resource'并将DLLImport修改为:
[DllImport("Unmanaged Driver.dll, Wrapper Engine, Version=1.0.0.0,
Culture=neutral, PublicKeyToken=null",
CallingConvention = CallingConvention.Winapi)]
Run Code Online (Sandbox Code Playgroud)
其中'Wrapper Engine'是我托管DLL的程序集名称'Unmanaged Driver.dll'是非托管DLL
当我跑步时,我得到:
访问被拒绝.(HRESULT异常:0x80070005(E_ACCESSDENIED))
我从MSDN和http://blogs.msdn.com/suzcook/看到了这应该是可能的......
是否有人知道可以将多个DLL和.EXE打包到一个可执行文件中的程序.我不是在谈论.NET案例,我在谈论一般的DLL,其中一些是我用C++生成的,其他一些是我无法控制的外部DLL.
我的具体案例是一个用py2exe打包的python程序,我希望通过打包来"隐藏"另一个DLL.但问题很普遍.
看看的东西:
几乎得到了它.它可以将可执行文件+任何东西打包到一个exe中,但是当打开它时,它将为每个打包的文件启动默认的opener.因此,如果用户用户dlldepend已安装,它将启动它(因为这是默认的dll开启器).
也许这不可能?
答案摘要:
DLL打开由操作系统管理,因此将DLL打包成可执行文件意味着在某些时候,需要将它们提取到操作系统可以找到它们的位置.没有灵丹妙药.
所以,我想要的是不可能的.
除非...
我们改变了操作系统中的内容.感谢Conrad指向ThinInstall,它将应用程序和操作系统加载机制虚拟化.使用ThinInstall,可以将所有内容打包在一个exe(DLL,注册表设置,...)中.
我有VS2008解决方案包含一个项目,该项目生成一个C#可执行文件,该项目引用了一个生成包含C++/CLI和非托管C++的DLL的项目.
我想将这些合并到一个可执行文件中,因为C++ DLL包含我想要嵌入主可执行文件的安全代码.
我不能使用ILMerge,因为dll包含托管代码和非托管代码.建议的解决方案似乎是使用link.exe将C#程序集与C++目标文件链接起来.这就是我想要做的.
我手动编辑了c#可执行文件的项目文件以生成netmodule.我在可执行项目中添加了一个构建后步骤,以运行link.exe将c#netmodule和已编译的C++目标文件链接在一起,然后运行mt.exe来合并两个项目创建的程序集清单.这运行成功,但是exe仍然包含对C++项目的正常构建过程生成的dll中定义的c ++类型的引用和使用.
然后我在C++ dll的项目设置中指定了/ NOASSEMBLY,因此它还生成了一个netmodule.在C#项目中,我删除了对C++项目的引用,但在解决方案中添加了项目依赖性.我手动编辑了C#项目文件,包括类似于:
<ItemGroup>
<AddModules Include="..\Debug\librarycode.netmodule" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
即引用现在由C++项目生成的C++ netmodule.
但是,现在我的post build事件中的链接器步骤失败了:
error LNK2027: unresolved module reference 'librarycode.netmodule'
fatal error LNK1311: 1 unresolved module references:
Run Code Online (Sandbox Code Playgroud)
这完全可以理解,因为我没有链接到librarycode netmodule; 我链接在用于生成netmodule的C++目标文件中.
简而言之,如何将ac#executable和C++目标文件合并到一个程序集中?我错过了什么?
到目前为止我的引用源(来自MSDN上的link.exe命令链接引用等)是以下两篇文章:
非常感谢你提前.
我在Steve Teixeira的博客中完全遵循了这个例子,并证实它有效.使用反射器,我可以看到生成的可执行文件包含两个netmodule.c#netmodule包含对另一个netmodule的引用但没有名称?!如果将程序集移动到新目录,则第二个netmodule变为未引用(显然),但可执行文件仍然运行,因为c#netmodule中存在具有正确定义的类型.
请注意,原始c#netmodule确实包含对c ++ netmodule的命名引用,因此它必须是删除名称的链接器步骤.
试图在我的示例项目中遵循此示例,我已将/ ASSEMBLYMODULE参数添加到我的后期构建链接器步骤中.链接器现在失败了
LNK2022: metadata operation failed (80040427) : Public type 'MixedLanguageLibrary.Class1' is defined in multiple places in this assembly: 'MixedLanguageDemo.exe' and 'mixedlanguagelibrary.netmodule'
LINK : fatal error LNK1255: link failed because of metadata errors
Run Code Online (Sandbox Code Playgroud)
我猜这是链接器魔术删除我缺少的模块引用名称. …
可能的重复:
在已编译的可执行文件中嵌入 DLL
是否可以将 DLL 嵌入到控制台应用程序中 如果可以的话,我们会如何去做呢?
通常情况下,我很乐意将 DLL 留在外面,但工作中已经有几个人问过我这个问题,老实说我也不知道。