Bri*_*rij 175 .net c# dll reference visual-studio-2010
我有一个visual studio解决方案.我在解决方案中有很多项目.有一个主要项目作为启动并使用其他项目.有一个项目说"ProjectX".它的参考被添加到主项目中.ProjectX引用了另一个不是解决方案的.NET dll(例如abc.dll).
现在这个abc.dll应该被复制到主项目的bin/debug文件夹中,但它不会被复制到那里.为什么不被复制,任何已知的原因?
Ove*_*urg 102
我发现如果ProjectX引用了abc.dll但没有直接使用abc.dll中的任何DEFINED类型,则不会将abc.dll复制到主输出文件夹.(它将被复制到ProjectX输出文件夹,使其更加混乱.)
因此,如果你没有在ProjectX中的任何地方明确使用abc.dll中的任何类型,那么在ProjectX中的一个文件中的某处放置一个虚拟声明.
AbcDll.AnyClass dummy006; // this will be enough to cause the DLL to be copied
Run Code Online (Sandbox Code Playgroud)
您不需要为每个类执行此操作 - 只需一次就足以使DLL复制并且一切都按预期工作.
附录:请注意,这可能适用于调试模式,但不适用于发布.有关详细信息,请参阅@nvirth的答案.
nvi*_*rth 62
只是对霸王Zurg的回答的旁注.
我已经以这种方式添加了虚拟引用,并且它在调试模式下工作:
public class DummyClass
{
private static void Dummy()
{
var dummy = typeof(AbcDll.AnyClass);
}
}
Run Code Online (Sandbox Code Playgroud)
但在发布模式下,依赖的dll仍然没有被复制.
但这有效:
public class DummyClass
{
private static void Dummy()
{
Action<Type> noop = _ => {};
var dummy = typeof(AbcDll.AnyClass);
noop(dummy);
}
}
Run Code Online (Sandbox Code Playgroud)
这个信息实际上花了我几个小时来弄清楚,所以我想我分享它.
Mik*_*oud 49
是的,你需要设置Copy Local为true.不过,我敢肯定,你还需要从主项目引用该组件,并设置Copy Local以true以及-它不只是得到从依赖程序集复制.
您可以Copy Local通过单击下面的组件References并按F4 进入该属性.
Ary*_*dlé 31
当您将其设置为装配属性时,它看起来很光滑
[AttributeUsage(AttributeTargets.Assembly)]
public class ForceAssemblyReference: Attribute
{
public ForceAssemblyReference(Type forcedType)
{
//not sure if these two lines are required since
//the type is passed to constructor as parameter,
//thus effectively being used
Action<Type> noop = _ => { };
noop(forcedType);
}
}
Run Code Online (Sandbox Code Playgroud)
用法将是:
[assembly: ForceAssemblyReference(typeof(AbcDll.AnyClass))]
Run Code Online (Sandbox Code Playgroud)
Dar*_*nso 23
进入同样的问题.背景信息:在构建之前,我在解决方案中添加了一个新的Project X. 项目Y依赖于项目X,项目A,B,C依赖于项目Y.
构建错误是找不到项目A,B,C,Y和X dll.
根本原因是新创建的Project X以.NET 4.5为目标,而其余解决方案项目则以.NET 4.5.1为目标. Project X没有构建,导致其他项目也没有构建.
确保所有新添加的项目都与解决方案的其余部分目标相同的.NET版本.
da_*_*ker 16
不确定这是否有帮助,但对我来说,很多时候我引用了一个DLL(当然会自动将它添加到bin文件夹中).但是,该DLL可能需要额外的DLL(取决于我正在使用的功能).我不想在我的项目中引用它们,因为它们只需要与我实际使用的DLL相同的文件夹.
我通过"添加现有文件"在Visual Studio中完成此操作.除了Add_data文件夹之外,您应该可以将它添加到任何位置.我个人只是将它添加到根目录.
然后将该文件的属性更改为...
Build Action = None(将此设置为内容实际上将"root"版本复制到根目录,再加上Bin中的副本).
复制到输出文件夹=如果更新则复制(基本上只有在缺少时将其放入BIN文件夹,但之后不执行)
当我发布时...我添加的DLL仅存在于BIN文件夹中,而在发布位置中没有其他地方(这就是我想要的).
小智 10
您还可以检查以确保您要查找的DLL未包含在GAC中.我相信如果构建计算机上的GAC中已经存在这些文件,那么Visual Studio非常聪明.
我最近遇到过这种情况,我一直在测试一个需要在GAC中存在程序集的SSIS包.我已经忘记了这一点,并想知道为什么这些DLL在构建期间没有出现.
要检查GAC中的内容(从Visual Studio Developer命令提示符):
gacutil -l
Run Code Online (Sandbox Code Playgroud)
或者输出到文件以便于阅读:
gacutil -l > output.txt
notepad.exe output.txt
Run Code Online (Sandbox Code Playgroud)
要删除程序集:
gacutil -u MyProjectAssemblyName
Run Code Online (Sandbox Code Playgroud)
我还应该注意,一旦我从GAC中删除了文件,它们在构建后正确地输出到\ bin目录中(即使对于根项目中没有直接引用的程序集).这是在Visual Studio 2013 Update 5上.
如果右键单击引用的程序集,您将看到一个名为“复制本地”的属性。如果 Copy Local 设置为 true,则程序集应包含在 bin 中。然而,Visual Studio 似乎存在一个问题,有时它不包含 bin 文件夹中引用的 dll...这是对我有用的解决方法:
| 归档时间: |
|
| 查看次数: |
139981 次 |
| 最近记录: |