SSIS脚本任务找不到Newtonsoft.Json。

4
我已将dll安装到GAC,甚至更新dll以将其安装到GAC,但我收到以下错误提示:
“无法加载文件或程序集'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'或其某个依赖项。系统找不到指定的文件:'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'。” App.config
<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>

GAC位置:

C:\Windows\Microsoft.NET\assembly\GAC_MSIL\Newtonsoft.Json\v4.0_12.0.0.0__30ad4fe6b2a6aeed\Newtonsoft.Json.dll

我也将dll文件复制到了C:\Windows\System32,但当我尝试从这个位置添加引用时,Visual Studio无法找到它。


你是在本地运行还是通过服务器/目录运行?当从服务器运行时,它需要在服务器GAC中。另一个要检查的事项是64位与32位运行时。 - Joe C
@JoeC 现在正在本地运行此程序。 - user3266638
3个回答

9
尝试使用 ResolveEventHandler 委托在发生未找到 .dll 的错误后加载它。 这可以直接放在 Main() 方法上方。
static ScriptMain()
{
 AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    if (args.Name.ToUpper().Contains("NEWTONSOFT"))
    {
   string path = @"C:\DLL File Path\";
   return System.Reflection.Assembly.LoadFile(System.IO.Path.Combine(path, "Newtonsoft.Json.dll"));
    }
    return null;
}
public void Main()
{
    ...

我已经在本地解决了我的问题,但当我在服务器上测试时,我相信这可能会有所帮助。 - user3266638
所以,当我在服务器上设置我的SSIS包时,我们的DBA告诉我,我们不允许在我们的SQL服务器上安装Dlls。我将我的dlls部署到另一台服务器上,并使用此方法和网络路径引用它们,这样就可以工作了。 - user3266638
我有一个问题。使用这段代码加载2个不同的dll的正确方法是什么?我已经让它工作了,但我向ResolveEventHandler委托注册了2种不同的方法。虽然它可以工作,但这是正确的方式吗? - user3266638
很高兴听到问题已解决。关于正确处理此问题的方法,只需确保所针对的错误是与其相应的确切.dll文件有关的,这可以通过测试多个异常时引发的异常以及提供正确的文件路径来确认。您可能已经意识到,使用ToUpper是为了避免任何大小写差异。 - userfl89

1
为了解决这个问题,我添加了一个新的脚本任务,并从其中打开了Nugget。
我安装了Microsoft.AspNet.WebApi.Client包,然后从该包中添加了System.Net.Http和Newtonsoft.Json dlls到我的GAC中。
之后,我从它们所在的位置引用了这些新的dlls,这解决了问题。 只有当您能够将dll安装到运行SSIS包的服务器/计算机的GAC中时,才能使用此方法。

0

我知道问题已经解决了,但我想分享另一个对我有效的解决方案。 以下是我使用Visual Studio 2017和Netwonsoft版本13.0.1解决它的方法:

先决条件: 确保您已在SSIS、脚本任务中安装了Newtonsoft包。


希望这篇文章能像对我一样对其他人有所帮助。 三周前,我开始学习C#和SSIS,虽然我知道它们是如何工作的,但我无法做出详细的解释。 非常感谢您的反馈和分享经验。


验证问题

据我所知,每个组件或任务都引用一个dll文件来操作。该文件可以在“GAC_MSIL”中找到。

因此,如果您在安装NewtonSoft后没有看到“Newtonsoft.Json”文件夹,则问题就出在这里。 您需要使用gacutils进行安装才能使其正常工作,或者通过上述解决方案进行安装。

解决问题

1. Open Powershell as Administrator
2. Go to the nuget package folder (See Below)
3. Key in the following:
    a. e.g "C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7 Tools\gacutil.exe" /i Newtonsoft.Json.dll

将程序集安装到全局程序集缓存(GAC)中


如何找到 GAC_MSIL 文件夹

• .NET 1.0 - NET 3.5: c:\windows\assembly (%systemroot%\assembly)
• .NET 4.x: %windir%\Microsoft.NET\assembly

来自如何查看GAC中的文件夹和文件?

在哪里找到gacutil.exe

   e.g C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin

gacutil.exe在哪里?

如何找到NuGet包?

  e.g C:\Users\username\\.nuget\packages\newtonsoft.json\13.0.1\lib\net45

查找 DLL 文件


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