类库中的引用没有复制到运行项目的bin文件夹中我有一个代表我类库的逻辑层.对于该库,我为Google.Apis.Analytics.v3添加了一个nuget包-它安装了包及其所有依赖项。我有一个使用此逻辑类库(常规参考)的控制台应用程序。一切都写得很好。问题是在运行时它会抛出无法找到Google.Apis.dll的异常。这个DLL是用nuget下载的依赖。检查BIN文件夹,我发现这个DLL存在于类库bin文件夹中,但不在控制台应用程序BIN文件夹中(而其他相关的DLL是)。所以这意味着在编译期间并不是所有的引用都被复制。我已经在网上搜索并找到了所有不起作用的解决方法(例如手动编辑项目文件并删除该dll定义中的真实xml行)。我最终做的是在我的控制台应用程序中添加相同的nuget库-它可以工作,但感觉有点脏,不是它应该的方式。我认为控制台应用程序是客户端,应该从该逻辑类库中获取服务,并且应该知道它的内容,而无需“客户端”担心它。此外,该控制台应用程序并不是唯一使用该服务的应用程序,我也计划使用该功能的网络应用程序-所以我需要向该网络应用程序添加相同的nuget-再次感觉有点混乱..。只有我?这是正确的方法吗?我正在考虑编写一个WCF项目来处理此功能-但就功能而言,这似乎只是一些开销,并且可能会减慢我的工作流程以使其在我看来“更清洁”。我只是想得太多了吗?谢谢解释对于示例场景,假设我们有项目X、程序集A和程序集B。程序集A引用程序集B,因此项目X包含对A和B的引用。此外,项目X包含引用程序集A的代码(例如A.SomeFunction()).现在,您创建一个引用项目X的??新项目Y。因此依赖链如下所示:Y=>X=>A=>B。VisualStudio/MSBuild试图变得聪明,只引入它检测为项目X的??引用项目Y需要;这样做是为了避免项目Y中的参考污染。问题是,由于项目X实际上不包含任何显式使用程序集B的代码(例如B.SomeFunction()),VS/MSBuild不会检测到X需要B,因此不会复制它到项目Ybin目录;它只复制X和A程序集。解决方案您有两个选项来解决此问题,这两个选项都会导致将程序集B复制到项目Y的bin目录中:在项目Y中添加对程序集B的引用。将伪代码添加到项目X中使用程序集B的文件中。我个人出于两个原因,更喜欢选项2。如果您将来添加另一个引用项目X的??项目,则不必记住还包括对程序集B的引用(就像您必须使用选项1一样)。您可以明确说明为什么需要存在虚拟代码而不是将其删除。因此,如果有人确实删除了代码(比如使用重构工具查找未使用的代码),您可以轻松地从源代码管理中看出代码是必需的并恢复它。如果你使用选项1并且有人使用重构工具来清理未使用的引用,那么你没有任何注释;您会看到从.csproj文件中删除的引用。这是我遇到这种情况时通常添加的“伪代码”示例。//除非我们不再需要汇编A,否则不要删除此代码!privatevoidDummyFunctionToMakeSureReferencesGetCopiedProperly_DO_NOT_DELETE_THIS_CODE(){//这个文件使用程序集A,那个程序集依赖于这个程序集Bject,//已经执行显式引用程序集B的代码。因此,当另一个项目引用//这个项目时,这个项目的assembly和assemblyA被复制到项目的bin目录中,但//assemblyB没有复制。因此,为了复制所需的程序集B,我们在此处添加一些引用程序集B的虚拟代码(永远不会//??被调用);这将标记VS/MSBuild以复制所需的程序集B。vardummyType=typeof(B.SomeClass);Console.WriteLine(dummyType.FullName);如果你有以下依赖链:Lib1和对Lib1的引用,为了在MyApp的bin目录中获取Lib1的dll(否则你会得到一个运行时错误)。不可能(或者可能真的很难)确定最终在Lib2的bin目录中的确切文件集,这些文件是安全的并且适合复制到MyApp。如果构建系统假定Lib2的bin目录中的所有内容对于MyApp都是安全的,或者如果它为您隐式引用Lib1,则它可能会无意中更改MyApp的行为。想象一个解决方案,其中多个项目依赖于Lib2,但其中一个项目想要使用Assembly.LoadFrom/Activator.CreateInstance/MEF/等加载相邻的.dll文件。(一个插件)而另一个没有。自动复制操作可以抓取Lib2和插件dll,并将其复制到第一个和第二个项目的构建目录(因为它在构建操作的结果中位于Lib2的bin目录中)。这将改变第二个应用程序的行为。或者,如果它在您引用Lib2时为您提供了一个更智能且隐式引用的Lib1(并且不只是复制bin目录内容),它仍然可能导致意想不到的后果。如果MyApp已经依赖于Lib1,但它使用的是与Lib2需要的副本兼容的GAC'd/ngen副本怎么办?如果添加对Lib2的引用会隐式为您创建对Lib1的引用,这可能会改变加载的Lib1并改变应用程序的运行时行为。它可能会检测到MyApp的bin目录下已经有Lib1并跳过它,但它会假设Lib1已经存在是正确的。也许它是一个陈旧的.dll等待被清理操作擦除,覆盖是正确的做法。NuGet解决了您描述的包依赖性问题。如果Lib1和Lib2都有nuget包,并且Lib2包依赖于Lib1包,那么当你将Lib2添加到MyApp时,Lib1也会被添加。两个pacakges的dll最终都在MyApp的bin目录中。做到这一点的最好方法是反思你的想法。而不是思考:思考:如果你有10个dll,用postbuild事件复制更简单:以上是C#学习教程:类库中的引用没有复制到的bin文件夹中shared的全部内容正在运行的项目,如果对你有用,需要了解更多C#学习教程,希望大家多多关注——xcopy"$(ProjectDir)bin*.dll"$(SolutionDir)MyTargetProjectbin"/y这篇文章整理自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处:
