我有这个名为' Helpers'我在其中放入了一些可重复使用的代码。大部分代码都用在我的大多数项目中,通常没有特殊要求。
前段时间我有一些可重复使用的SharePoint代码,要求我添加引用。
use strict;
use warnings;
my $file_in = "doctor.txt";
open (FF, "<$file_in");
my $temp = <FF>; # remove first line
my %out;
while (<FF>)
{
my ($id, $Name, $app1, $app2) = split /\|/, $_;
$out{$id}[0] = $Name;
push @{$out{$id}[1]}, $app1;
push @{$out{$id}[2]}, $app2;
}
foreach my $key (keys %out)
{
print $key, "|", $out{$key}[0], "|", join (",", @{$out{$key}[1]}), "|", join (",", @{$out{$key}[2]}), "\n";
}
每个班级都拥有自己的文件但位于相同的名称空间&#39;助手&#39;。只有此SharePoint类具有“使用Microsoft.SharePoint.Client&#39;
”引用我的Helper库的项目现在包含Microsoft.SharePoint.Client.dll。
即使将此类分隔到另一个名称空间,也会将其复制。在引用上有一个Copy Local开关,但这样可以防止dll在使用时被复制。
有没有一种简单的方法可以防止在使用和时在本地复制本地复制本地dll?
答案 0 :(得分:2)
创建库时,必须将其视为公共API。该库不知道调用库将使用哪些函数/类。在你的情况下,听起来像库和调用者都在同一个解决方案中,所以你被认为是“为什么它不能检查我正在使用的功能?”那是非常困难的,如果不是不可能的话(我倾向于不可能)。为什么?如果我有一个程序是一个控制台应用程序,询问用户“你希望我执行什么功能?”用户键入名称“Helpers.SharePoint.GetItems({”a“,”b“,”c“},null)”
然后通过一些相当复杂的解析和反射,你可以调用这个方法。 Visual Studio在编译时如何知道?它不会有任何线索,因为它是100%用户驱动的。这肯定是一个不起眼的例子,但它是一个例子,说明编译器为什么不知道你是否需要那个库。
因此,它会为您复制它,因为它无法确定需要什么和不需要什么。它认为这是必要的,因为你告诉它是在添加引用时。
如果你想要删除dll,你可以创建一个post build步骤,在构建之后手动删除它,但是Visual Studio不会为你做这个,这是一件好事。就个人而言,我会说让dll存在。唯一的危害是磁盘空间,在2TB硬盘驱动器世界中,dll占用的可能500KB几乎不重要!