Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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#_Asp.net_.net_Generics_Iis - Fatal编程技术网

C# 为什么在代码隐藏类中使用泛型方法会导致动态编译异常?

C# 为什么在代码隐藏类中使用泛型方法会导致动态编译异常?,c#,asp.net,.net,generics,iis,C#,Asp.net,.net,Generics,Iis,在对我正在使用的传统ASP.NETWebForms应用程序进行一些更改后,每当我尝试访问应用程序的某个页面时,我都会收到以下异常 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\MyApplication\bdb24adf\eb592999\App\u Web\u mypage.aspx.cdcab7d2.dc1wid-d.0.cs(148):错误CS0012:在未引用的程序集中定义了类型“MyDataM

在对我正在使用的传统ASP.NETWebForms应用程序进行一些更改后,每当我尝试访问应用程序的某个页面时,我都会收到以下异常

C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\MyApplication\bdb24adf\eb592999\App\u Web\u mypage.aspx.cdcab7d2.dc1wid-d.0.cs(148):错误CS0012:在未引用的程序集中定义了类型“MyDataModelClass”。必须添加对程序集“MyDataModelAssembly,版本=40.0.0.30,区域性=中性,PublicKeyToken=7ca3fb5049101832”的引用

经过数小时的故障排除,我最终将问题缩小到了一个方法,该方法已添加到一个基本页面类中,应用程序中的所有页面都是从该类派生的。称之为MyBasePageClass

protected T CreatePlaceholder<T>(T item) where T : MyDataModelClass, new()
{
    return new T { TemporaryIdentifier = item.TemporaryIdentifier };
}
受保护的T CreatePlaceholder(T项),其中T:MyDataModelClass,new()
{
返回新的T{TemporaryIdentifier=item.TemporaryIdentifier};
}
当我注释掉该方法时,异常消失,一切都如我所期望的那样工作。如果在web.config文件中添加程序集引用,此异常也会消失。奇怪的是,当我将引用更改为Copy Local=true时,这也会使异常消失

这不是第一次将MyDataModelClass合并到应用程序中。它在几乎每个代码隐藏文件中的许多地方都被使用。但由于某些原因,将其用作类型约束超出了.Net的处理能力

我只能想象它与泛型的性质有关,但我不知道那可能是什么。我不是第一个尝试过这个的人,但是我在某处或其他任何地方都找不到任何关于它的信息。这可能与IIS的配置方式有关吗

更新:

MyDataModelAssembly确实安装在GAC中。以下是gacutil/l的输出:

全局程序集缓存包含以下程序集: MyDataModelAssembly,版本=40.0.0.30,区域性=中性,PublicKeyToken=7ca3fb5049101832,processorArchitecture=MSIL


类型“MyDataModelClass”是在未引用的程序集中定义的。您必须添加对程序集“MyAssembly,Version=40.0.0.30,Culture=neutral”的引用。

在您的项目中是否确实有对该类在其中定义的任何程序集(DLL)的引用?错误认为你没有

通过在此处添加DLL并将其设置为“复制本地”来修复此问题:

编辑2: 这看起来像是您问题的解决方案:

但没有真正的解释


编辑:

由于您的程序集位于GAC中,因此它应该能够找到它,而不需要复制本地

确保GAC中的版本就是它要查找的版本。您可以使用来检查GAC中的内容。在我的计算机上,gacutil.exe位于“C:\Program Files(x86)\Microsoft SDK\Windows\v10.0A\bin\NETFX 4.6.1 Tools”中,但它可能位于您计算机上的其他位置。找到后,从命令行运行以下命令:

gacutil/l MyDataModelAssembly

gacutil输出的版本和公钥令牌必须与错误消息中的内容匹配


必须将定义MyDataModelClass的程序集DLL复制到IIS运行应用程序的位置


复制本地设置告诉Visual Studio将DLL复制到编译输出路径(可能是IIS运行应用程序的位置)。对于不在中的任何程序集,您需要将Copy Local set设置为true。

此程序集位于GAC中。为什么只有在添加泛型方法时才会发生这种情况?这不是类中引用MyDataModelClass的唯一位置。在使用引用的代码实际运行之前,不会出现错误。因此,您使用该类的其他地方可能还没有运行。所有代码都还没有运行。当IIS尝试编译任何.aspx文件时会发生此异常。我应该说它会根据需要加载程序集。它是如何定义“按需”的,我不太清楚。但是可以肯定地说,如果您想在项目中的任何位置使用该类,那么IIS需要访问DLL,这意味着将“复制本地”设置为true。是的,项目中有一个引用。该应用程序在VisualStudio中构建得很好。当IIS在为页面提供服务时获取它时,会发生编译错误。请确保将其设置为同时复制到IIS目录(“复制本地”)。DLL必须彼此处于相同的相对结构中-代码不够聪明,无法找到不合适的缺少的DLL。如果不包括通用方法,它就可以正常工作。程序集安装在GAC中。如果您的自定义程序集安装在GAC中,那么这将完全改变您的问题。如何?异常消息与定位程序集无关。它抱怨程序集没有被引用,即使它显然是被引用的。(否则,解决方案就无法建立。)为什么要投反对票?我很想知道是谁在这个问题上继续投反对票。对问题进行上下投票的全部目的是使经过充分研究的、困难的问题能够上升到顶部,而质量差的问题能够下降到底部。考虑到似乎没有人对这个问题有一个好的答案,它需要上升到顶部。