Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 同一程序集的两个副本的程序集标识是否可以不同?_C#_.net - Fatal编程技术网

C# 同一程序集的两个副本的程序集标识是否可以不同?

C# 同一程序集的两个副本的程序集标识是否可以不同?,c#,.net,C#,.net,在这些主题中,我找到了下一个代码: Assembly assembly1 = Assembly.LoadFrom(path1); Assembly assembly2 = Assembly.LoadFrom(path2); // These both point to the assembly from path1, so this is true Console.WriteLine(string.Compare(assembly1.CodeBase, assembly2.CodeBase)

在这些主题中,我找到了下一个代码:

Assembly assembly1 = Assembly.LoadFrom(path1);
Assembly assembly2 = Assembly.LoadFrom(path2);

// These both point to the assembly from path1, so this is true
Console.WriteLine(string.Compare(assembly1.CodeBase, assembly2.CodeBase) == 0);
我是这样做的:

    Assembly ass1 = Assembly.LoadFrom(Path.GetFullPath ("DataTypes.dll"));
    Assembly ass2 = Assembly.LoadFrom(Path.GetFullPath("test\\DataTypes.dll"));

    Console.WriteLine(ass1.CodeBase == ass2.CodeBase);

文件夹测试中的DataTypes.dll是程序文件夹中DataTypes.dll的副本。预期结果为真,但我的程序显示为假。如果需要,我可以提供任何信息进行解释。

它来自不同的副本,因此是不同的代码库。如果它们具有相同的名称,那么就调用程序集而言,它们是相同的。除了对文件进行二进制比较外,我看不出如何保证所需的等效性。

它来自不同的副本,因此是不同的代码库。如果它们具有相同的名称,那么就调用程序集而言,它们是相同的。除了对文件进行二进制比较外,我看不出你如何保证你所寻找的等价性。

我有一个解决你问题的办法

将程序集放在两个文件夹中,但放在同一个程序集中

        var asmPath = AppDomain.CurrentDomain.BaseDirectory; // Your assemblies's root folder
        var asmFullPath1 = System.IO.Path.Combine(asmPath, @"test\ClassLibrary1.dll");
        var asmFullPath2 = System.IO.Path.Combine(asmPath, @"test2\ClassLibrary1.dll");
        Assembly asm1 = System.Reflection.Assembly.LoadFrom(asmFullPath1);
        Assembly asm2 = System.Reflection.Assembly.LoadFrom(asmFullPath2);
        Console.WriteLine(asm1.CodeBase == asm2.CodeBase);
您将获得相同的代码库

要查找有关代码库的更多信息


我有办法解决你的问题

将程序集放在两个文件夹中,但放在同一个程序集中

        var asmPath = AppDomain.CurrentDomain.BaseDirectory; // Your assemblies's root folder
        var asmFullPath1 = System.IO.Path.Combine(asmPath, @"test\ClassLibrary1.dll");
        var asmFullPath2 = System.IO.Path.Combine(asmPath, @"test2\ClassLibrary1.dll");
        Assembly asm1 = System.Reflection.Assembly.LoadFrom(asmFullPath1);
        Assembly asm2 = System.Reflection.Assembly.LoadFrom(asmFullPath2);
        Console.WriteLine(asm1.CodeBase == asm2.CodeBase);
您将获得相同的代码库

要查找有关代码库的更多信息


MSDN对代码库的定义:

最初指定的部件位置


您可能需要比较程序集位置。

代码库的MSDN定义:

最初指定的部件位置


您可能需要比较assembly.Location(汇编.Location)。

正如Tony所说,这两个程序集是从不同的代码库(即磁盘上的位置,或者实际上是LAN或WAN上的位置)加载的,因此.Net不仅会同时加载这两个程序集(很简单,但本身并不愚蠢),但它也会将每个程序集视为不同的—每个程序集中的每个重复类型都被视为不同的

正是出于这个原因,我非常小心地使用了
LoadFrom
,因为它很乐意从不同的位置加载相同的程序集

这是一种现象,在网站中也会发生,其结果非常严重,如果预加载程序集,则临时加载将使用
LoadFrom
bin\
文件夹预加载,而实际上aqssemblies通常会从
临时Asp.Net文件夹
(临时Asp)加载

在这种情况下,可以从
bin\AssemblyA.dll
预加载AssemblyA,然后运行时从
TempASP\AssemblyA.dll
再次加载它,因为该文件夹位于
load
使用的搜索路径的第一位。这可能会导致非常严重的副作用,例如在您认为正常情况下不可能引发错误的代码编译部分抛出
InvalidCastException
s


如果比较相等,那么二进制比较,正如Tony所建议的,是你最好的选择。但是,如果您实际上只想加载这些程序集的一个副本,那么您应该首先考虑从DLL获得<代码>组件ys/COD>(有一个不加载程序集的构造函数)然后将该名称传递给
程序集.Load
,然后将其从正确的位置加载。

正如Tony所说,这两个程序集是从不同的代码库加载的(即磁盘上的位置,或者实际上是LAN或WAN上的位置),因此.Net不仅会同时加载这两个程序集(愚蠢地加载,而且本身不会愚蠢),但它也会将每个程序集视为不同的—每个程序集中的每个重复类型都被视为不同的

正是出于这个原因,我非常小心地使用了
LoadFrom
,因为它很乐意从不同的位置加载相同的程序集

这是一种现象,在网站中也会发生,其结果非常严重,如果预加载程序集,则临时加载将使用
LoadFrom
bin\
文件夹预加载,而实际上aqssemblies通常会从
临时Asp.Net文件夹
(临时Asp)加载

在这种情况下,可以从
bin\AssemblyA.dll
预加载AssemblyA,然后运行时从
TempASP\AssemblyA.dll
再次加载它,因为该文件夹位于
load
使用的搜索路径的第一位。这可能会导致非常严重的副作用,例如在您认为正常情况下不可能引发错误的代码编译部分抛出
InvalidCastException
s


如果比较相等,那么二进制比较,正如Tony所建议的,是你最好的选择。但是,如果您实际上只想加载这些程序集的一个副本,那么您应该首先考虑从DLL获得<代码>组件ys/COD>(有一个不加载程序集的构造函数)然后将该名称传递给
Assembly.Load
,然后将其从正确的位置加载。

DataTypes.dll是否为强名称程序集?这是您的问题。您需要强名称程序集,以便比较它们的标识。DataTypes.dll是否强名称程序集?这就是您的问题。您将需要强名称程序集,以便可以比较它们的标识。位置比较也会显示FAL。即使您得到codebase1=codebase2,这实际上意味着什么?DLL是否完全相同?。不。这一切都取决于@Praetor12试图用codebase1=-codebase2实现什么。有点像,但位置很重要。如果它们完全相同,但其中一个来自远程来源,该怎么办?除非我在检查是否正在更新构建或部署,否则对我来说,相同性是有误导性的。位置的比较也会显示错误。即使你得到了codebase1=codebase2,还有什么不正确