【问题标题】:SSIS script task can't find Newtonsoft.JsonSSIS 脚本任务找不到 Newtonsoft.Json
【发布时间】:2019-03-08 16:54:31
【问题描述】:

我将 dll 安装到 GAC 甚至更新了 dll 以将其安装到 GAC 但我收到此错误:

“无法加载文件或程序集 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其依赖项之一。系统找不到指定的文件。”:“Newtonsoft.Json,版本=4.5.0.0,文化=中性,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 位运行时。
  • @JoeC 现在在本地运行。

标签: c# ssis ssis-2012 gac


【解决方案1】:

尝试使用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()
{
    ...

【讨论】:

  • 我能够在本地解决我的问题,但是当我在服务器上进行测试时,我确信这可能会派上用场。
  • 所以,当我在服务器上设置我的 SSIS 包时,我们的 DBA 告诉我,我们不允许在我们的 SQL 服务器上安装 Dll。我将我的 dll 部署到另一台服务器上,并使用它和网络路径引用了它们,它工作正常。
  • 我确实有一个问题。使用此代码加载 2 个不同的 dll 的正确方法是什么?我让它工作了,但是我在 ResolveEventHandler 委托中注册了 2 种不同的方法。它有效,但这是正确的方法吗?
  • 很高兴听到问题已解决。至于处理此问题的正确方法,只需确保解决的错误是针对它们对应的确切 .dll 的,这可以通过测试多个发生时引发的异常来确认,并且是正确的提供文件路径。您可能已经意识到这一点,但 ToUpper 用于避免任何大小写差异。
【解决方案2】:

为了解决这个问题,我添加了一个新的脚本任务并从其中打开了块。

我安装了 Microsoft.AspNet.WebApi.Client 包,然后从这个包中将 System.Net.Http 和 Newtonsoft.Json dll 添加到我的 GAC。

之后,我从添加它们的位置引用了这些新的 dll,这解决了问题。

只有在您能够将 dll 安装到运行 SSIS 包的服务器/计算机上的 GAC 中时,这才有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多