dia*_*ler 32 .net c# projects-and-solutions visual-studio
我有以下项目结构:
Library1 <--[project reference]-- Library2 <--[ref]-- Executable
-------- -------- ----------
ContentFile .cs files .cs files
.cs files
Run Code Online (Sandbox Code Playgroud)
所有项目引用都具有CopyLocal = true.
当我构建项目时,ContentFile会将其复制到Library2输出目录,而不是复制到Executable输出目录,这意味着ContentFile应用程序运行时缺少可执行文件.
为什么内容文件被复制到Library2输出目录,但不是Executable?有没有办法将它复制到后者(我想在没有构建事件的情况下这样做,因为我相信人们会忘记这一点)?
我正在寻找一个合理且可维护的解决方案; 在添加新项目或新的间接引用的内容文件时,只需要很少的工作,因此尽可能不要忘记这样做.
使用Post-Build事件(如xcopy ../Library/bin/Debug/SomeDll.dll bin/Debug); 并手动设置项目的输出目录$(SolutionDir)/bin/...而不是默认(每个项目),两者都很快变得一团糟.将内容文件添加为"主项目"中的链接也太乏味了.如果C#具有与Visual C++相同的输出文件的默认设置(即$SolutionDir/$Platform/$Configuration),那就没问题了,但事实并非如此.
我也考虑过根本不使用标准的MSBuild程序并编写自定义构建目标(比如在Atmel Studio中使用gcc),但我没有做得太远.此外,我希望Visual Studio的标准"构建"和"调试"命令像往常一样工作.
以下是我正在做的更多细节.
我有一个Executable项目的解决方案.此外,还有很多项目可以调用Plugin.通过托管项目引用Executable引用所有这些Plugin.
由于插件项目是针对可执行文件定制的,但可能具有可重用的组件,因此主要功能通常在External项目中实现,使Plugin项目仅仅是包装器(并非总是如此).
所述External项目有时使用由第三方提供的本机DLL.然后将这些DLL External作为内容文件添加到项目中并Copy to output dir设置为Copy always.所以结构如上图所示:
External <---------------[is not aware of]--------------------+
-------- |
.cs files <--[reference]-- PluginWrapper <--[reference]-- Executable
"Native DLL" ------------- ----------
.cs files .cs files
Run Code Online (Sandbox Code Playgroud)
奇怪的是,"本机DLL"被复制到External输出目录(显然),以及它 PluginWrapper的,但不是 Executable.
然后开发人员的工作流程是写的External,作为一个完全独立的实体(他们的作品都被重用经常),用它包住PluginWrapper,然后只添加一个项目引用PluginWrapper到Executable.我觉得奇怪的是,这显然是一件不寻常的事情.
我认为编辑Executable的MSBuild目标XML(也包括间接引用的内容文件)可能已经解决了这个问题.
我可能想要将DLL作为嵌入式资源添加到项目中,但是嵌入这样的本机DLL对我来说似乎很奇怪.最后,通过从上图中剥离"[不知道]"并添加项目引用来改变开发人员的工作流程External,正如Brenda Bell建议的那样,可能是最明智的解决方案,即使不理想.
更新2
请注意,嵌入式资源创意可能无法在所有情况下使用.如果有必要在可执行文件的目录(不是cwd或任何东西)中放置依赖项,那么由于缺少安装文件夹中的管理员权限(从嵌入式资源解压缩文件),这可能无法工作.听起来很奇怪,但这是我们使用的第三方库之一的一个严重问题.
Bre*_*ell 21
将Library1引用添加到Executable项目.
编辑:
您可以将所有内容放在单独的项目中,将其所有条目设置为"内容"和"始终复制",并从外部和可执行文件引用该项目
-
IMO你正在寻找嵌入式资源,而不是内容文件.
编译库1时,内容文件将放在其bin文件夹中.编译库2时,编译器识别引用的代码并包含它(库1.dll)但内容文件无法识别,因为它们在库2中的任何位置都没有提到.将库2链接到可执行文件时也是如此.
如果您的内容文件相对较小(图标,模板等),并且如果您丢失了源代码,则无法编辑它们,那么您可以将它们作为资源嵌入并提供返回内容的公共方法,例如:
public static Stream GetResourceContent(string rName){
string resName = System.Reflection.Assembly
.GetExecutingAssembly().GetManifestResourceNames()
.FirstOrDefault(rn => rn.EndsWith("."+rName));
if(resName!=null)
return System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resName);
else
return null;
}
Run Code Online (Sandbox Code Playgroud)
如果您的内容必须更改,例如模板等,请考虑在可执行项目中包含副本
| 归档时间: |
|
| 查看次数: |
11249 次 |
| 最近记录: |