无法加载文件或程序集 SSIS 脚本任务

Fil*_*ena 2 c# ssis script-task

我有一个带有脚本任务的 DTSx,它将替换 Word 文档中的一些标签,然后将其另存为 PDF,但它不断显示错误:“无法加载文件或程序集 '' 或其依赖项之一。系统找不到该文件指定的。” 我尝试过使用 Aspose、GemBox、Syncfusion,错误总是相同的。当我从 NuGet 使用它们时,任务甚至不会启动...但是当我将 DLL 和所有附加文件复制到计算机中的文件夹时,它会显示上述错误。我用的是框架4。

你能帮忙吗?

谢谢。

bil*_*nkc 5

nuget 包和 SSIS 脚本任务不起作用。是的,它会为您编译,但是当您退出脚本编辑器时,nuget 包不会与可执行文件一起序列化,并且当它运行时,没有“大脑”来下载预期的程序集。SSIS 希望程序集要么序列化为存储在 SSIS 包中的内容,要么存储在全局程序集缓存 (GAC) 中。

如何将 nuget 软件包安装到 GAC?

三大步骤

找到GACUTIL.exe

打开命令提示符 cd "\Program Files (x86)",然后dir /s /b gacutil.exe这会告诉您 gacutil.exe 程序所在的位置(如果它存在于您的计算机上 - 可能不存在)。

作为参考,这是我的开发机器的样子

C:\Program Files (x86)>dir /s /b gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.2 Tools\x64\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\x64\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\gacutil.exe
C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64\gacutil.exe
Run Code Online (Sandbox Code Playgroud)

记下其中一个可执行文件所在的位置。由于路径中有空格,需要将路径用双引号括起来才能运行,即"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe"

找到装配体

找到您需要的 nuget 包并祈祷它是一个签名的程序集。SSIS 中的脚本任务/组件开发是一个奇怪的野兽。我的SSIS包位于此路径\users\bfellows\Documents\Solution\Project\MyPackage.dtsx

但是,当我编辑脚本任务时,会发生什么?VS 的一个新实例启动,我做我需要做的事情。假设我将 newtonsoft 添加到我的包中,因此我将所有内容都存储在 json 中。

在此输入图像描述

等等,这是什么胡言乱语?我的项目文件夹指向C:\Users\bfellows\AppData\Local\Temp\Vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\VstacRTUuMELWk2UL3Wn4JQCWw\ “是”,任务/组件编辑器使用临时路径来创建新的解决方案和项目,在那里完成所有工作,当您关闭编辑器时,所有项目解决方案位都会序列化回 SSIS 包。nuget 的内容不包含在序列化位中。哎呀。

那么,您需要该程序集,但它位于临时路径中 - 您该怎么办?您编辑包,确保当前已下载 nuget 包并且不要关闭脚本任务。右键单击解决方案名称 (VstaProjects) 并选择“属性”。

在此输入图像描述

找到该路径并将结果值复制出来。我的解决方案文件位于C:\Users\bfellows\AppData\Local\Temp\Vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\VstaProjects.sln

太棒了,它是项目文件夹上方的一个文件夹,但我们不需要路径中的 VstaProject.sln 部分。

打开命令提示符并将目录更改为该位置。

cd C:\Users\bfellows\AppData\Local\Temp\Vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A
Run Code Online (Sandbox Code Playgroud)

从这里,您有一个package子文件夹。命令 dir /s /b packages*.dll 将递归地查找位于 packages 文件夹下的所有程序集(具有 .dll 扩展名的文件),并提供一组简短的信息 - 在本例中为完全限定路径。

C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A>dir /s /b packages\*.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\net20\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\net35\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\net40\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\netstandard1.0\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\netstandard1.3\Newtonsoft.Json.dll
C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft.Json.13.0.1\lib\netstandard2.0\Newtonsoft.Json.dll
Run Code Online (Sandbox Code Playgroud)

天哪,有很多集会。哪一款适合我?SSIS 脚本任务/组件是针对 .NET 语言的 4.x 框架构建的。列出的最高网络分支是net45我们实际安装程序集时需要知道的。

包\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll

安装组件

在管理员模式下打开命令提示符。这可能会提示弹出 UAC 对话框,并且您可能需要使用管理员凭据,具体取决于您的安全设置。

之后安装到 GAC 就很简单了。

"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe" /if C:\path\to\my\nuget\package.dll
Run Code Online (Sandbox Code Playgroud)

/if信号安装并强制重新安装,即使程序集已存在。

如果我想从上面安装 newtonsoft dll,该语法将是

“C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\gacutil.exe”/if“C:\Users\bfellows\AppData\Local\Temp\vsta\SSIS_ST140\VstatIBdQdlmHEa__RFeT36Nd9A\packages\Newtonsoft .Json.13.0.1\lib\net45\Newtonsoft.Json.dll”

但我从别人那里得到了一个集会

不用担心,你可以处理这个

显然,如果尚未将程序集签名给@kearl ,则可以对程序集进行签名(也称为向现有 DLL 添加强名称)

  1. 打开 Visual Studio 命令提示符
  2. 生成密钥文件 sn -k keyPair.snk
  3. 获取程序集的 MSIL ildasm SomeAssembly.dll /out:SomeAssembly.il
  4. 重命名原始程序集,以防万一 ren SomeAssembly.dll SomeAssembly.dll.orig
  5. 从 MSIL 输出和您的 KeyFile 构建新程序集 ilasm SomeAssembly.il /dll /key=keyPair.snk