我有一个基础项目,可以提供两个不同的项目.我希望能够让主项目在编译时将所有引用编译成一个dll.
这需要是项目构建中内置的东西,以便Jr开发人员不必担心它.
解决方案:我最后在项目的Post-build操作中添加了一行,以便良好的构建执行以下操作:
$(ProjectDir)ilmerge.exe /out: /ver: <.dll> <.dll>
Run Code Online (Sandbox Code Playgroud)
ilmerge.exe 被移动到项目中,上面的线路获取了dll并创建了一个.
我已经搜索了这个,之前有很多答案,但都显得过于复杂.
我是C#和Windows开发的新手(以前的Mac开发人员).
我使用Visual Studio社区版在C#中编写了一个简单的控制台应用程序.我的应用程序使用两个第三方库(CommandLineParser和json.NET)从VS中添加到我的项目与NuGet.
我想要做的就是将我的项目构建为一个独立的.exe文件,它可以简单地从命令提示符运行,而不必担心最终用户必须安装大量的DLL(这是我以前不习惯处理的东西)一个新的Windows用户).我知道最终用户需要安装.NET框架.在我的用例中是否有一个用于构建单个.exe文件的防止白痴的指南?
我不禁想到这一定是一个非常普遍的问题.
谢谢.
根据这个:https://msdn.microsoft.com/en-us/library/jj152935%28v=vs.110%29.aspx
为了使.NET Framework 4/4.5能够与.NET 2.0应用程序一起使用,必须提供app.config.
我想最大化我的.NET 2.0应用程序的兼容性.
我需要它与只安装了.NET 2.0或安装了.NET 4的PC一起使用.
问题是,让app.config始终与可执行文件一起出现并不像我希望的那样专业.
我的应用程序是一个独立的应用程序,所以有一个app.config使其工作并不真正使它成为一个独立的应用程序.
这是app.config中的设置,你看它不是我的设置它的运行时版本设置.
<configuration>
<startup>
<supportedRuntime version="<version>"/>
</startup>
</configuration>
Run Code Online (Sandbox Code Playgroud)
该应用程序将在.NET 2.0框架中运行时没有app.config,但如果在.NET 4.0框架内,则需要app.config.
有没有解决这个问题?
谢谢你的阅读.
编辑:
我的问题不同于: 如何在VS2010 C#控制台应用程序中将我的App.config编译到我的exe中?
因为这解决了.NET运行时版本设置,而不是应用程序的设置本身.
我正在尝试将 WebView2 DLL 嵌入到 C# 项目中。我添加了 3 个 DLL:
Microsoft.Web.WebView2.Wpf.dll
Microsoft.Web.WebView2.Core.dll
WebView2Loader.dll
Run Code Online (Sandbox Code Playgroud)
作为我的项目的嵌入式资源。由于它是一个 WPF 项目,我不需要 Microsoft.Web.WebView2.Forms.dll。
我已经正确合并了 Newtonsoft.Json.dll。
在调试模式下,没有问题,因为所有DLL都被复制到输出目录。
因为我希望可执行文件是可移植的,所以我只需要一个文件(我知道用 exe 复制 DLL 是可行的,但我需要一个文件)。当我仅将主可执行文件移动到另一个文件夹时,当我使用 webview2 控件时应用程序崩溃(该控件在启动时未加载)。
我试图弄清楚是否所有的 DLL 都参与其中。Microsoft.Web.WebView2.Wpf.dll 已正确嵌入,我不需要在目标文件夹中使用它。
然而,最后两个仍然是必需的。我认为这可能是因为它们是由 Microsoft.Web.WebView2.Wpf.dll 调用的,而不是由主程序集调用的。
如何从主程序集中加载最后两个文件以获得单个执行文件?
编辑:所有 DLL 都作为嵌入式资源添加到项目中
感谢@mm8给我部分想法(欢迎任何完整解决方案的建议)实现这一目标。
因此,可以通过添加 3 个 WebView2 DLL 并将它们设置为嵌入资源来将它们嵌入到您的项目中。Microsoft.Web.WebView2.Wpf.dll(或者Microsoft.Web.WebView2.WinForms.dll,取决于您的选择)可以直接加载到内存中。但最后两个(Microsoft.Web.WebView2.Core.dll和WebView2Loader.dll)需要保存为文件:
public MainWindow()
{
// For Newtonsoft.Json.dll, Microsoft.Web.WebView2.Wpf.dll, Microsoft.Web.WebView2.Core.dll and WebView2Loader.dll
// Incorporation as embedded resource
// To avoid having multiple files, only one executable
AppDomain.CurrentDomain.AssemblyResolve += GetEmbeddedDll; …Run Code Online (Sandbox Code Playgroud) 我有一个DLL存储两个应用程序共有的类.我想将我的应用程序限制在一个EXE文件中,并希望看看我是否能以某种方式将此DLL嵌入到我的主EXE中.
如何将外部DLL嵌入到我的应用程序中?(如果可能的话)
我正在使用Unity3D for Mobile的免费版本,它不允许我System.Net.Sockets在移动设备上使用命名空间.问题是我正在使用.dll引用的编译库(即IKVM)System.Net.Sockets.我实际上并没有在IKVM中使用引用该引用的类System.Net.Sockets,因此我没有购买$ 3000 Unity Pro移动许可证,而是创建了一个Sockets名为的命名空间的存根库,dudeprgm.Net.Sockets它只是用存根替换了所有的类和方法(我这样做了Mono源代码).
我需要将System.Net.Sockets.*我的dll中的所有引用替换为dudeprgm.Net.Sockets.*.我知道这样的事情是可能的并且由其他人完成(参见下面的编辑,在页面底部).我想知道自己该怎么做.
我能够使用Mono.Cecil提出以下代码.
它遍历所有IL指令,检查操作数是否为a InlineType,然后检查内联类型是否属于其中System.Net.Sockets,然后将其重命名为dudeprgm.Net.Sockets并写入.**我不确定这是否是在Mono.Cecil中进行"查找和替换"的正确方法.问题是,这并没有抓住所有Sockets用法(见下文).
private static AssemblyDefinition stubsAssembly;
static void Main(string[] args) {
AssemblyDefinition asm = AssemblyDefinition.ReadAssembly(args[0]);
stubsAssembly = AssemblyDefinition.ReadAssembly("Socket Stubs.dll");
// ...
// Call ProcessSockets on everything
// ...
asm.Write(args[1]);
}
/*
* This will be run on every property, constructor and method …Run Code Online (Sandbox Code Playgroud) 可能的重复:
在已编译的可执行文件中嵌入 DLL
是否可以将 DLL 嵌入到控制台应用程序中 如果可以的话,我们会如何去做呢?
通常情况下,我很乐意将 DLL 留在外面,但工作中已经有几个人问过我这个问题,老实说我也不知道。
可能重复:
在c#.exe中嵌入.net dll
我一直在尝试将.dll(特别是Ionic.Zip.dll)嵌入到我的应用程序中,然后使用CodeDom编译新的.exe并需要Ionic.Zip.dll.我希望能够在没有任何额外的.dll的情况下分发我的程序.如果工作目录中有DLL,则程序和编译的程序运行正常.我没有使用ILMerge,因为编译的程序需要.dll而我不能强迫用户获取ILMerge.但是,如果没有.dll,我会收到此错误.
原始程序不会使用此错误编译代码
error CS0006: Metadeta file 'Ionic.Zip.dll" could not be found.
Run Code Online (Sandbox Code Playgroud)
编译程序(在原始程序的工作目录中具有dll时编译)
Description:
Stopped working
Problem signature:
Problem Event Name: CLR20r3
Problem Signature 01: scrub.exe
Problem Signature 02: 0.0.0.0
Problem Signature 03: 50b0f364
Problem Signature 04: Scrub
Problem Signature 05: 0.0.0.0
Problem Signature 06: 50b0f364
Problem Signature 07: 1
Problem Signature 08: 38
Problem Signature 09: System.IO.FileNotFoundException
OS Version: 6.1.7601.2.1.0.256.48
Locale ID: 1033
Run Code Online (Sandbox Code Playgroud)
调试错误
Could not load file or assembly 'Ionic.Zip, Version=1.9.1.8, Culture=neutral, PublicKeyToken=edbe51ad942a3f5c' or one of …Run Code Online (Sandbox Code Playgroud) 可能重复:将
DLL嵌入已编译的可执行文件中
我想将我的C#应用程序编译为单个exe文件.问题是我的项目依赖于许多其他项目,在Release编译时导致文件夹中的许多dll .有没有办法让这些dll包括exe?
注意:它不需要独立于.NET框架.我假设使用这个exe的任何人都会安装它.
根据要求,客户端提供exe-(包含要下载的文件的URL)如果我们使用google api,我们需要提供额外的引用以及exe.客户不允许这样做.
我使用webclient下载文件,但是它下载文件类型为HTML的文件.我的要求是在不使用谷歌API的情况下从谷歌驱动器下载文件.有没有办法做到这一点?
我已经尝试了如下代码
WebClient wb = new WebClient();
wb.DownloadFile("https://drive.google.com/file/d/0BzpAdEg-KyDjNVVSb0FBOWQ4V0k/view?usp=sharing", @"C:\TFS\test\test.pdf");
Run Code Online (Sandbox Code Playgroud)
结果如下图所示