Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Visual Studio中编译时,如何将DLL保存在其他文件夹中?_C#_Visual Studio_Assemblies_Projects And Solutions - Fatal编程技术网

C# 在Visual Studio中编译时,如何将DLL保存在其他文件夹中?

C# 在Visual Studio中编译时,如何将DLL保存在其他文件夹中?,c#,visual-studio,assemblies,projects-and-solutions,C#,Visual Studio,Assemblies,Projects And Solutions,假设我有一个窗口窗体/控制台应用程序C#项目,其中包含一些外部引用,以及对同一解决方案中其他类库项目的引用 构建窗口窗体项目时,我希望引用的库存储在不同的位置(例如:bin\Release\libraries),而不是与.exe文件存储在同一文件夹中 可以这样做吗?在项目属性中设置引用路径 您还可以通过在project peoperties中指定输出路径来指定编译的exe的位置。是的,如果可能,您可以在msbuild脚本中执行此操作。虽然我不能给你一个确切的答案,但请看下面这个问题,所以你的问题

假设我有一个窗口窗体/控制台应用程序C#项目,其中包含一些外部引用,以及对同一解决方案中其他类库项目的引用

构建窗口窗体项目时,我希望引用的库存储在不同的位置(例如:bin\Release\libraries),而不是与.exe文件存储在同一文件夹中


可以这样做吗?

在项目属性中设置引用路径


您还可以通过在project peoperties中指定输出路径来指定编译的exe的位置。

是的,如果可能,您可以在msbuild脚本中执行此操作。虽然我不能给你一个确切的答案,但请看下面这个问题,所以你的问题有两个部分:

如何配置将程序集/EXE生成到您选择的文件夹中的解决方案-这是通过VS(项目属性->生成->输出路径)中的项目属性配置的。还要检查每个引用的“复制本地”属性的值

如何从非默认位置(即从…\Libraries文件夹)加载程序集文件-您需要更改app.config文件以将此非默认路径添加到程序集搜索位置

指向Microsoft站点的链接不再有效,因此来自wayback计算机的摘要::

方法1:在全局程序集缓存(GAC)中安装程序集。 GAC是一个计算机范围的代码缓存,其中安装了公共语言运行库。GAC存储您专门指定由多个应用程序共享的程序集

注意:您只能在GAC中安装强名称程序集

方法2:使用带有标记的应用程序配置(.config)文件 .config文件包含以下设置:

•特定于应用程序的设置

•公共语言运行库读取的设置,如程序集绑定策略设置和远程处理对象设置

•应用程序读取的设置

标记指定公共语言运行库可以在何处找到程序集。公共语言运行库应用.config文件中
标记的设置。
标记的设置确定部件的版本和位置

方法3:使用AssemblyResolve事件 每当公共语言运行库尝试绑定到程序集并失败时,都会触发AssemblyResolve事件。您可以使用AddHandler方法将事件处理程序添加到应用程序中,以便在触发AssemblyResolve事件时返回正确的程序集

AssemblyResolve事件处理程序必须返回[Assembly]对象,公共语言运行库必须绑定到此对象。通常,可以使用Assembly.LoadFrom方法加载程序集,然后返回对象


您可以在此处找到组织项目参考的最佳实践:


请参阅“VisualStudio项目参考+复制本地true选项是邪恶的!”一章。

前面给出了正确答案。我要说的是,有一个名为nuget的包


在您的启动项目上安装它。dll和XMLs将进入一个lib文件夹,如果您不想自定义,您将有一个如何完成的工作示例。

您是将它们作为文件引用还是项目引用引用?通过后期生成步骤,但您还必须更改AppDomainSetup以设置程序集的探测路径,否则将永远无法加载库dll。“你想过吗?”梅拉莫克说。我的解决方案中有对项目的引用,这些(以及WinForm)也有对外部.dll文件的引用?在Libraries子文件夹下使用dll有什么好处?@Petar这是我在部署应用程序的可交付成果时通常做的事情,我认为使用
.exe
单独处理文档、许可证文件等比将
.exe
文件和5-10
.dll
文件放在同一文件夹中要干净得多(在本例中:部署=仅对文件进行ziping)在本答案的第二部分,还要查看
.config
元素-它允许您指定其他(子)搜索程序集的目录目前为止最简单的解决方案!谢谢!我有生成后事件,可以将生成目录的内容复制到.zip中。这些生成后事件似乎在PrettyBin进行“清理”之前运行。你知道如何让PrettyBin在生成后事件之前运行吗?@jenovachild可能不是不再相关,但万一有人还在想:PrettyBin只在.csproj文件中添加了一个额外的后构建步骤。如果您需要在某个特定文件之前/之后运行它,只需卸载您的项目,打开.csproj文件并修改后构建事件的顺序。引用参考页面:“在使用VisualStudio编译nunit解决方案时,程序集nunit.core.dll被复制了21次!这意味着C#编译器必须复制/加载/解析21次,显然在这种情况下,C#编译器没有提供缓存/哈希代码优化。”但是”事实上,NUnit的代码分层非常好。这是创建大量程序集的最初决定的结果。”因此,基本上,拥有大量程序集可以以牺牲编译时间为代价指导更好的代码。这不是一件坏事。