C# 在Visual Studio中编译时,如何将DLL保存在其他文件夹中?
假设我有一个窗口窗体/控制台应用程序C#项目,其中包含一些外部引用,以及对同一解决方案中其他类库项目的引用 构建窗口窗体项目时,我希望引用的库存储在不同的位置(例如:bin\Release\libraries),而不是与.exe文件存储在同一文件夹中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脚本中执行此操作。虽然我不能给你一个确切的答案,但请看下面这个问题,所以你的问题
可以这样做吗?在项目属性中设置引用路径
您还可以通过在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的代码分层非常好。这是创建大量程序集的最初决定的结果。”因此,基本上,拥有大量程序集可以以牺牲编译时间为代价指导更好的代码。这不是一件坏事。