奇怪的错误 - CS0012:类型x在未被引用的程序集中定义

36

类型“x”是在一个未被引用的程序集中定义的。您必须添加对程序集“abc123”的引用。

我有一个.NET 2.0 Web应用程序,引用了我的程序集“abc123”。该程序集存在于GAC中,并且我已经验证它与正确(相同)的版本。整个应用程序没有问题,除了一个.aspx页面。问题页面有一个重复器(repeater),其中显示一个用户控件作为其“字段”之一。绑定一个类型y的列表到repeater时,我将类型x的列表(作为y的一个属性)传递给用户控件,如下所示:

<uc1:usercontrol id="ucusercontrol " runat="server" myPublicUserControlProperty='<%#Eval("CollectionOfX") %>'/>

在用户控件的属性设置中,我将类型x的列表绑定到用户控件中的gridview。

需要注意的奇怪事情是,这份报告在我的开发电脑上工作正常,但一旦我部署在任何服务器上就无法工作。我的电脑是Windows XP,IIS6,VS2005。服务器是Windows Server 2003,IIS6。

希望我已经解释得足够清楚了。谢谢您提供的任何见解。

7个回答

33

我是Mike的同事,我们找到了一个解决方案。

X类型被定义在他的程序集中,那个程序集只存在于全局程序集缓存(GAC)中。尽管他的ASP.NET Web应用程序已经引用了这个程序集,但它仅仅对这个用户控件从GAC中加载失败。其余部分的应用程序都能够正常工作。我们通过在bin目录中放置程序集的副本来确认加载失败,并且一切正常。我们删除了程序集后,问题又出现了。

我们的解决方案是手动在web.config文件的assemblies部分添加一个条目,以便将ASP.NET指向GAC。

似乎每当你在页面(而不是代码后台)中引用类型时,你需要在web.config文件或页面指令中定义程序集信息。

<assemblies>
        <add assembly="MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=[MyPublicKeyToken]"/>   
</assemblies>

4

当解决这些类型的问题时,Fusion Log Viewer 一直是一个很好的帮助工具。


4

还有一个错误可能表现出类似的症状,描述在这里

解决方法是删除C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\目录中的所有内容,这个错误只在调试模式下出现。


那个链接已经失效了。Codebetter.com 返回一个503服务不可用的错误。 - csharpforevermore

1
我发现如果type x实际上是你的App_Code中的一个类,那么将其修改并重新保存通常会强制Web应用程序重新编译并解决问题。

0

往往是由于缓存的程序集引起的。解决此问题的一种方法是在项目或配置文件中进行“强引用”。请参考此博客post


0

我遇到了完全相同的错误,但是我的类中有一个公共构造函数,它使用来自另一个项目的对象作为参数。

我通过将该构造函数更改为内部构造函数来解决了这个问题。


0
对我来说这是一个版本控制拉取的问题。
在 Visual Studio 中,打开“解决方案资源管理器”中的“引用”,并浏览它。
如果有任何一个黄色警告三角形,请记住该名称,删除它,然后重新添加它(或者让 ReSharper 为您完成)。
当同事添加新的包和引用时,在拉取项目之后,我遇到了几次这种情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接