相关疑难解决方法(0)

将DLL嵌入已编译的可执行文件中

你知道,我在任何地方都没有看到一个好的答案.是否可以将预先存在的DLL嵌入到已编译的C#可执行文件中(这样您只能分发一个文件)?如果有可能的话,怎么去做呢?

通常情况下,我很酷,只是将DLL放在外面并让安装程序处理所有内容,但是有几个人在工作,他们问我这个,老实说我不知道​​.

.net c# dll merge linker

582
推荐指数
12
解决办法
35万
查看次数

将非托管dll嵌入到托管C#dll中

我有一个使用DLLImport使用非托管C++ DLL的托管C#dll.一切都很好.但是,我想在我的托管DLL中嵌入非托管DLL,如Microsoft解释:

http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.dllimportattribute.aspx

所以我将非托管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/看到了这应该是可能的......

c# unmanaged managed dllimport

82
推荐指数
4
解决办法
6万
查看次数

将exe + dll打包成一个可执行文件(不是.NET)

可能重复:
如何将C++ windows dll合并到C#应用程序exe中?

是否有人知道可以将多个DLL和.EXE打包到一个可执行文件中的程序.我不是在谈论.NET案例,我在谈论一般的DLL,其中一些是我用C++生成的,其他一些是我无法控制的外部DLL.

我的具体案例是一个用py2exe打包的python程序,我希望通过打包来"隐藏"另一个DLL.但问题很普遍.

看看的东西:

  • ILMerge:特定于.NET
  • NETZ:特定于.NET
  • UPX:执行DLL压缩但不包含多个DLL + EXE打包
  • FileJoiner:
几乎得到了它.它可以将可执行文件+任何东西打包到一个exe中,但是当打开它时,它将为每个打包的文件启动默认的opener.因此,如果用户用户dlldepend已安装,它将启动它(因为这是默认的dll开启器).

也许这不可能?


答案摘要:

DLL打开由操作系统管理,因此将DLL打包成可执行文件意味着在某些时候,需要将它们提取到操作系统可以找到它们的位置.没有灵丹妙药.

所以,我想要的是不可能的.

除非...

我们改变了操作系统中的内容.感谢Conrad指向ThinInstall,它将应用程序和操作系统加载机制虚拟化.使用ThinInstall,可以将所有内容打包在一个exe(DLL,注册表设置,...)中.

dll

31
推荐指数
3
解决办法
4万
查看次数

如何将C#和C++程序集链接到单个可执行文件中?

我有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命令链接引用等)是以下两篇文章:

非常感谢你提前.


UPDATE1

我在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)

我猜这是链接器魔术删除我缺少的模块引用名称. …

c# linker c++-cli visual-c++

10
推荐指数
1
解决办法
6806
查看次数

将 DLL 嵌入到控制台应用程序中

可能的重复:
在已编译的可执行文件中嵌入 DLL

是否可以将 DLL 嵌入到控制台应用程序中 如果可以的话,我们会如何去做呢?

通常情况下,我很乐意将 DLL 留在外面,但工作中已经有几个人问过我这个问题,老实说我也不知道。

.net c#

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

c# ×4

.net ×2

dll ×2

linker ×2

c++-cli ×1

dllimport ×1

managed ×1

merge ×1

unmanaged ×1

visual-c++ ×1