无法加载文件或程序集''或其某个依赖项

18

请帮忙吗?

我只有一个库,它让我疯了。我收到的错误信息如下。我没有使用任何其他依赖项。

Could not load file or assembly 'FOD.Intranet.Lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=039c1f3a4c719e82' or one of its dependencies. The system cannot find the file specified. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IO.FileNotFoundException: Could not load file or assembly 'FOD.Intranet.Lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=039c1f3a4c719e82' or one of its dependencies. The system cannot find the file specified.

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.  

Stack Trace: 


[FileNotFoundException: Could not load file or assembly 'FOD.Intranet.Lib, Version=1.0.0.0, Culture=neutral, PublicKeyToken=039c1f3a4c719e82' or one of its dependencies. The system cannot find the file specified.]
   NewCollection.VisualWebPart1.VisualWebPart1UserControl.TodaysNews() +0
   NewCollection.VisualWebPart1.VisualWebPart1UserControl.Page_Load(Object sender, EventArgs e) +52
   System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +25
   System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +42
   System.Web.UI.Control.OnLoad(EventArgs e) +132
   System.Web.UI.Control.LoadRecursive() +66
   System.Web.UI.Control.AddedControl(Control control, Int32 index) +350
   NewCollection.VisualWebPart1.VisualWebPart1.CreateChildControls() +155
   System.Web.UI.Control.EnsureChildControls() +146
   System.Web.UI.Control.PreRenderRecursiveInternal() +61
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Control.PreRenderRecursiveInternal() +224
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3394
9个回答

28
为了让Visual Studio将第三方程序集甚至是来自解决方案中其他项目的自己的程序集添加到全局程序集缓存(GAC)中,请按照以下步骤操作:
  1. 打开SharePoint项目中Package文件夹中的Package.package。

  2. 在底部区域单击“高级”。

  3. 单击“添加”,选择要添加的程序集类型。

  4. 在对话框中选择dll文件,勾选GAC或BIN,如果需要则添加安全控件和类资源条目。单击“确定”。

您的程序集将被打包到WSP中,在清单中定义并每次部署。


16

问题解决了!

我之前认为Visual Studio会把DLL复制到GAC(全局程序集缓存),但实际上并没有。所以我手动把它复制到了那里,现在可以使用了。

不过还有一个问题,当我部署SharePoint应用时,Visual Studio不把DLL复制到GAC是否正常呢?

对于那些想知道如何把DLL复制到GAC的人

有两种方法可以将DLL复制到GAC:

  1. 手动复制DLL

    1. 在Windows资源管理器中打开c:\windows\assembly目录
    2. 再打开一个窗口,转到DLL文件通常存放的bin文件夹(现在你有两个窗口打开)
    3. 选择要复制到GAC的DLL文件,拖动到assembly目录(c:\windows\assembly)中即可
  2. 使用VS自动将其部署到GAC中

    1. 在SharePoint项目中双击“Package”
    2. 打开Package.Package。在屏幕左下角找到“高级”,点击它
    3. 然后点击“添加”,选择“从项目输出添加程序集...”
    4. 在源项目下拉列表中选择项目,然后点击“确定”
    5. 最后部署解决方案,此时DLL文件将在GAC中。

感谢您的支持。


如果您想让Visual Studio执行此操作,请确保将引用的属性“复制本地”设置为True。 - Daniël Tulp
1
注意:绝不要手动操作Windows\Assembly文件夹,这是非常糟糕的做法。使用gacutil /i安装DLL,使用gacutil /u卸载DLL。/i需要完整路径,而/u则只需要dll名称(不包括扩展名)。 - David

2
对于不在全局程序集缓存中且被构建引用的程序集,如果平台目标不匹配,有时也会出现这种错误。因此,请将程序集平台类型与其使用的平台匹配。

enter image description here


0

对于那些仍在研究这个问题的人,需要知道的一件事是,有不同版本的GACutils,所以您需要确保使用正确的GACUTIL将DLL部署到正确的GAC中。

例如:如果我的DLL是在3.5 .net框架中编译的,而我的操作系统版本是64位Windows,则它将位于以下位置:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64

为了解决这个问题,我苦苦挣扎了4天。


0

这个错误是因为你的dll文件和项目文件在不同的文件夹中。

添加Visual Studio第三方程序集,如SelectPdf.dllSelectHtmlToPdf.dll等。

您只需要将您的dll文件放在同一个文件夹中,并引用此文件即可。

步骤:创建一个名为externaldll的文件夹,并将所有dll文件放在这里。


0
  • 版本号是否匹配?
  • 看到你正在尝试加载一个.lib文件而不是dll,这很奇怪。也许你想要加载一个dll?
  • 为了调试这种问题,可以尝试使用Fusion Logging
  • 虽然你说只使用了一个库,但是这个库可能有一些你不知道的依赖项。这个SO问题介绍了如何列出托管.NET程序集的依赖项。

嗨Dario_ramos,我正在加载一个dll,但程序集的名称是FOD.Intranet.Lib.dll。 - Imir Hoxha
那就不是问题了。我会尝试融合日志记录。 - dario_ramos
1
我创建了一个演示库,其中有一个方法可以将两个数字相加,并且我从一个SharePoint项目中引用它。我遇到了与上述相同的错误。现在,当我使用一个ASP.NET项目时,它正常工作,不会对dll文件抱怨。 - Imir Hoxha
你的Sharepoint项目配置肯定有问题。虽然我不太了解Sharepoint,但你可能需要调查一下在Sharepoint中dll查找是如何工作的。 - dario_ramos
谢谢Dario的帮助。我会进一步研究它,但这让我感到很疯狂。 - Imir Hoxha
你尝试过融合日志记录吗?由于它记录了所有的.NET程序集加载尝试,它会告诉你Sharepoint正在尝试查找dll的所有位置,如果是依赖关系问题,它会告诉你缺少什么。如果你使用强名称验证,也可能会导致加载问题。 - dario_ramos

0
请尝试取消引用 DLL,然后重新引用并重新构建项目。还要检查确保版本与项目 Web 配置文件中的匹配。

嗨Lafama,感谢您的回复。我已经取消引用并重新引用了它,但它仍然无法工作。在webconfig中,我必须查看类库dll还是使用dll的项目?我没有在webconfig中找到对此命名空间FOD.Intranet.Lib的任何引用。 - Imir Hoxha

0

假设您可以访问SharePoint服务器,请尝试以下操作。一些随机想法,没有特定的顺序。

  • 将程序集部署到GAC或将dll复制到Web应用程序的bin文件夹中
  • 在Web.config程序集部分和安全控件部分中添加程序集信息。
  • 如果您正在开发Web部件,请确保在Web部件的安全控件部分中添加其引用(虽然我认为这不是您的问题)
  • 使用强名称对程序集进行签名可能在某些情况下有所帮助。
  • 如果您有自定义依赖项,则需要对所有依赖项执行相同的步骤(除了.NET Framework和SharePoint相关的内容之外)

您是在使用Visual Studio开发SharePoint项目(是否是Web部件?)?您是否正在引用它在SharePoint项目中?您需要提供更多关于您的开发环境的细节才能确定问题。


0

如果您正在使用代码 Page.Load("control_path..."),请确保实际加载的 ascx 文件没有包含您异常消息中的程序集指令。

<%@ Register Tagprefix="SharePoint" Namespace="Microsoft.SharePoint.WebControls" Assembly="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>

嗨Maks,我正在用户控件中使用Import语句。我需要在.ascx文件中访问库。 - Imir Hoxha
1
所以这实际上是一个依赖项。你必须将这个库(FOD.Intranet.Lib)放入解决方案中。如果你需要帮助将自定义程序集添加到 wsp 中,请告诉我。 - Maks Matsveyeu
当我添加一个程序集的引用时,我看到Visual Studio将其复制到Bin文件夹中,并且我在Visual Studio的引用文件夹中看到它。我做错了什么? - Imir Hoxha
请查看这篇文章:http://blog.mastykarz.nl/including-additional-assemblies-wsp-visual-studio-sharepoint-development-tools/,它提供了一个逐步指南,教你如何将程序集添加到包中。对于你的情况来说更简单,你只需要添加一个现有的程序集而不是项目输出,并将部署目标设置为GAC。此外,你不需要添加SafeControls。 - Maks Matsveyeu

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