使用 powershell 解决程序集依赖关系引用

2024-04-25

我正在尝试使用 PowerShell v4.0 (x86/64) 针对我们的内部 API 之一来执行一些相当基本的操作,但我似乎无法克服依赖项加载。

到目前为止我有:

[Reflection.Assembly]::LoadFrom("C:\Users\David Shaw\Desktop\API\API.dll")

根据 Dat Bui 的博客文章 http://blogs.msdn.com/b/datbui/archive/2007/05/09/powershell-and-net-loading.aspx.

这工作正常,然后我尝试使用此 DLL 中的类型:

$a = New-Object API.API("", 1234)

这给了我以下错误:

New-Object : Exception calling ".ctor" with "2" argument(s): "Unable to find assembly API.Dependency, 
Version=1.2.5.0, Culture=neutral, PublicKeyToken=null'."
At line:1 char:6
+ $a = New-Object API.API("", 1234)
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

查看FusionLog,它查找依赖关系的唯一位置是:C:\Windows\System32\WindowsPowerShell\v1.0

到目前为止我尝试过的事情:

  • 设置 powershell 当前目录。
  • 将其编写为脚本而不是从控制台编写。
  • 我的依赖项与 API.dll 位于同一位置
  • Using LoadFile代替LoadFrom
  • Using Add-Type -Path API.dll
  • 设置.netCurrentDirectory https://stackoverflow.com/questions/6914080/powershell-dll-loading
  • Calling LoadFrom关于依赖性。
  • 在 Powershell 中执行 AppDomain.AssemblyResolve 事件(见下文),但此堆栈溢出 powershell:

从我的脚本:

$OnAssemblyResolve = [System.ResolveEventHandler] {
  param($sender, $e)
    $n = New-Object System.Reflection.AssemblyName($e.Name).Name
      $fn = "C:\Users\David Shaw\Desktop\API\$n.dll"
      return [Reflection.Assembly]::LoadFile($fn)       
}

[System.AppDomain]::CurrentDomain.add_AssemblyResolve($OnAssemblyResolve)

根据评论,API.dll 是 .Net 4.0 (AnyCPU),API.Dependency.dll 是 .Net 2.0 (AnyCPU)。如果这可能是一个问题,有什么想法可以解决它吗?


我对 NuGet 包也有类似的问题,其中我有两个都使用 NuGet 包的程序集(具体来说,Spring.NET https://www.nuget.org/packages/Spring.Core/图书馆)。我的第一个 C# 项目 (My1stProject) 使用 .NET Framework v4.0,因此包含特定于该框架版本的 NuGet 包 DLL。第二个 C# 项目 (My2ndProject) 针对 .NET Framework v4.7,因此从 NuGet 包中获取了 v4.5 程序集。项目 My2ndProject 依赖于 My1stProject。

当我编译代码时,一切正常。项目 My2ndProject 已编译,但 NuGet 包中包含的程序集适用于 v4.5 框架。

现在,当我尝试在 My2ndProject 的二进制输出目录中使用 Powershell 代码加载并获​​取程序集的类型时:$assembly = [System.Reflection.Assembly]::LoadFrom($My1stProjectFullPath), 其次是$assembly.GetTypes(),这会由于版本差异而失败 - v4.5 NuGet DLL 在那里,但它期望 v4.0 DLL。

所以,按照这个优秀的代码示例 https://www.azurefromthetrenches.com/powershell-binding-redirects-and-visual-studio-team-services/,我的解决方案是预加载我需要忽略其版本的二进制文件(以便将它们加载到应用程序域中),然后使用一些挂钩程序集解析过程的代码(类似于OP问题中的代码)和:

  • 首先尝试根据全名(包括版本、区域设置等)进行加载匹配。
  • 如果失败,则尝试仅对名称进行匹配(忽略版本等)

这是代码:

$candidateAssembly =  "C:\My2ndProject\bin\Debug\My1stProject.exe"

# Load your target version of the assembly (these were from the NuGet package, and 
# have a version incompatible with what My2ndProject.exe expects)
[System.Reflection.Assembly]::LoadFrom("C:\My2ndProject\bin\Debug\Spring.Aop.dll")
[System.Reflection.Assembly]::LoadFrom("C:\My2ndProject\bin\Debug\Spring.Core.dll")
[System.Reflection.Assembly]::LoadFrom("C:\My2ndProject\bin\Debug\Spring.Data.dll")

# Method to intercept resolution of binaries
$onAssemblyResolveEventHandler = [System.ResolveEventHandler] {
    param($sender, $e)

    Write-Host "ResolveEventHandler: Attempting FullName resolution of $($e.Name)" 
    foreach($assembly in [System.AppDomain]::CurrentDomain.GetAssemblies()) {
        if ($assembly.FullName -eq $e.Name) {
            Write-Host "Successful FullName resolution of $($e.Name)" 
            return $assembly
        }
    }

    Write-Host "ResolveEventHandler: Attempting name-only resolution of $($e.Name)" 
    foreach($assembly in [System.AppDomain]::CurrentDomain.GetAssemblies()) {
        # Get just the name from the FullName (no version)
        $assemblyName = $assembly.FullName.Substring(0, $assembly.FullName.IndexOf(", "))

        if ($e.Name.StartsWith($($assemblyName + ","))) {

            Write-Host "Successful name-only (no version) resolution of $assemblyName" 
            return $assembly
        }
    }

    Write-Host "Unable to resolve $($e.Name)" 
    return $null
}

# Wire-up event handler
[System.AppDomain]::CurrentDomain.add_AssemblyResolve($onAssemblyResolveEventHandler)

# Load into app domain
$assembly = [System.Reflection.Assembly]::LoadFrom($candidateAssembly) 

try
{
    # this ensures that all dependencies were loaded correctly
    $assembly.GetTypes() 
} 
catch [System.Reflection.ReflectionTypeLoadException] 
{ 
     Write-Host "Message: $($_.Exception.Message)" 
     Write-Host "StackTrace: $($_.Exception.StackTrace)"
     Write-Host "LoaderExceptions: $($_.Exception.LoaderExceptions)"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 powershell 解决程序集依赖关系引用 的相关文章

  • 托管 C++ 和 AnyCPU

    我有一个托管 C dll 我从 C 项目中引用它 C 项目将被编译为 AnyCPU 有没有办法编译 32 位和 64 位版本的托管 C dll 然后告诉 C 项目在运行时根据正在运行的体系结构加载正确的版本 让 AnyCPU dll 与 C
  • BackgroundWorker 如何决定在哪个线程上运行 RunWorkerCompleted 处理程序?

    我试图弄清楚 BGW 在工作完成后如何决定运行 RunWorkerCompleted 处理程序的线程 我的初始测试使用 WinForm 应用程序 在 UI 线程上 我开始bgw1 RunWorkerAsync 然后我尝试开始bgw2 Run
  • 多线程文件写入

    我正在尝试使用多个线程写入大文件的不同部分 就像分段文件下载器所做的那样 我的问题是 执行此操作的安全方法是什么 我是否打开文件进行写入 创建线程 将 Stream 对象传递给每个线程 我不希望发生错误 因为多个线程可能同时访问同一个对象
  • 提高大型结构列表的二进制序列化性能

    我有一个以 3 个整数保存 3d 坐标的结构 在测试中 我将 100 万个随机点放在一起 List 然后对内存流使用二进制序列化 内存流大小约为 21 MB 这似乎非常低效 因为 1000000 点 3 坐标 4 字节应该至少为 11MB
  • 通过网络共享的 SQL CE

    我之前见过这个问题 但找不到关于什么是可能 不可能以及什么解决方法可能可用的明确解释 我有一个现有的 C 应用程序 它使用 SQL CE 来存储本地信息 该数据库只能由单个应用程序访问 并存储在用户的 appdata 文件夹中 某些环境将
  • 将无限范围的值映射到 10 种颜色?

    我有以下 10 种颜色的列表 public static readonly IList
  • 正则表达式获取“-”之前的所有字符

    如何获取字符之前的字符串 使用正则表达式 例如 我有 text 1 我想回来 text 所以我看到了实现这一目标的许多可能性 string text Foobar test 正则表达式 匹配所有内容 直到第一个 Match result R
  • 如何使用正则表达式替换匹配的组值

    我想修改连接字符串中 数据源 组件的值 我正在考虑以下解决方案 使用这个正则表达式模式 data source w 1 w 我可以获得以下字符串匹配 Match Groups 0 Value data source MY PC SQLEXP
  • async-await 如何“节省线程”?

    我知道使用无线程异步有更多线程可用于服务输入 例如 HTTP 请求 但我不明白当异步操作完成并且需要一个线程来运行它们时 这如何不会潜在地导致线程饥饿继续 假设我们只有 3 个线程 Thread 1 Thread 2 Thread 3 并且
  • 反序列化时出现 Protobuf-net memcache 提供程序 null 类型错误

    我正在使用最新的 protobuf net lib 和 protobuf net memcache 提供程序 我需要序列化自定义类型 MyClass 的列表 ProtoContract public class MyClass ProtoM
  • 获取 SecureString 作为纯文本参数

    我正在尝试将 SecureString 作为纯文本参数获取到命令行 PowerShell 我知道安全字符串的形式是什么 例如 字符串 abc 将是安全字符串 71289371289 然后 我想将 71289371289 作为参数传递给脚本
  • 是否可以在 app.config 键值中包含超链接?

    是否可以将超链接作为 app config 键值对中文本的一部分 电子邮件正文文本作为值 我想从 app config 键值生成电子邮件正文 例如
  • 将 CSV 文件上传到 SQL 服务器

    上传大文件的最佳方式是什么csv使用 C 将数据文件导入 SQL Server 该文件包含大约 30 000 行和 25 列 首先 你不需要编程的东西 您可以使用 SQL 管理工具直接将 CSV 文件上传到 SQL 数据库 但是 如果您确实
  • powershell有method_missing()吗?

    我一直在研究 powershell 的动态功能 我想知道一些事情 powershell 中是否有类似于 Ruby 的 method missing 的东西 您可以在其中设置 捕获所有方法 来动态处理对对象上不存在的方法的调用 不 不是真的
  • 如何在 C# 中搜索 Excel 文件

    我正在使用的代码 private void OpenExcelFile Excel Application exlApp new Microsoft Office Interop Excel Application if exlApp nu
  • 如何使用静态方法最小起订量静态类(UnitOfWork 情况)?

    我有这些课程 public static class UnitOfWorkSS public static IUnitOfWork Begin return IoC Resolve
  • CvMat 和 Imread 与 IpImage 和 CvLoadImage

    使用 OpenCv 2 4 我有两个选项来加载图像 1 CvMat and Imread 2 IpImage and CvLoadImage 使用哪一个更好 我尝试将两者混合并最终出现段错误 imread返回一个Mat not CvMat
  • 自定义编译器警告

    在 Net 中使用 ObsoleteAtribute 时 它 会向您发出编译器警告 告诉您该对象 方法 属性已过时 应使用其他内容 我目前正在从事一个需要大量重构前员工代码的项目 我想编写一个自定义属性 可用于标记方法或属性 这些方法或属性
  • SoapHttpClientProtocol:以流而不是字符串的形式获取响应?

    我正在使用一种网络服务 它可以一次性输出大量数据 响应字符串可能约为 8MB 虽然在台式电脑上这不是问题 但嵌入式设备在处理 8MB 字符串对象时会发疯 我想知道是否有办法以流的形式获取响应 目前我正在使用如下方法 我尝试使用 POST 请
  • 从原始 URL 获取重定向 URL

    我的数据库中有一个表 其中包含一些网站的 URL 我必须打开这些 URL 并验证这些页面上的一些链接 问题是某些 URL 被重定向到其他 URL 对于这样的 URL 我的逻辑是失败的 有什么方法可以传递原始 URL 字符串并获取重定向的 U

随机推荐

  • 条件合并表

    我有 2 张桌子 Time X1 8 1 2013 56 9 1 2013 14 10 1 2013 8 11 1 2013 4 12 1 2013 78 Time X2 8 1 2013 42 9 1 2013 44 10 1 2013
  • 使用 Tesseract OCR 和 python 进行数字识别

    我使用 Tesseract 和 python 读取数字 从能量计 除了数字 1 之外 一切都运行良好 Tesseract 无法读取 1 数字 This is the picture I send to tesseract tesseract
  • 仅调整 matplotlib 中两个子图之间的距离

    我有 3 个子图 3 行和 1 列 我们可以用fig subplots adjust hspace 0 2 调整子图之间的距离 这将改变所有情况下子图之间的距离 地块 1 311 和地块 2 312 以及地块 2 312 和地块 3 313
  • R 堆积百分比频率直方图以及基于聚合数据的百分比

    I believe my question is very similar to this post https stackoverflow com questions 34903368 how to center stacked perc
  • sqlite 语句中返回的行数

    有没有简单的方法来获取 sqlite 语句返回的行数 我不想首先经历执行 COUNT 的过程 谢谢 每次致电时sqlite step 将变量加 1 如果你想要行数提前 那么就没有简单的方法了
  • 当对象的状态发生变化时触发Java中的事件

    我有一个 Java 对象 其状态随着时间的推移而变化 当对象中的某个字段达到特定值时 我希望触发外部事件 我知道 Swing 通过监听器处理这种模式 并且我在这个项目中使用 Swing 但我不确定哪种监听器适用于这种情况 用户不会更改对象的
  • Excel VBA 自动生成电子表格

    我和我的朋友目前有一个主电子表格 我需要定期将其分解为较小的电子表格 这曾经是一个手动过程 但我想将其自动化 我在 VBA 中创建了一个三步解决方案 它将帮助我完成以下任务 将相关过滤器应用于电子表格 将过滤后当前可见的数据导出到新电子表格
  • Sphinx——结合自动模块和自动类

    除非我错过了什么 斯芬克斯的automodule只会记录模块的成员 而不记录该模块中定义的类的属性 有办法吗自动地得到的行为automodule and autoclass以这样的方式组合 我可以自动获取模块成员的文档and在该模块中找到的
  • java - Google Play 游戏服务

    Google Play 游戏服务正在测试 public class MainActivity extends BaseGameActivity public void onCreate Bundle savedInstanceState s
  • 如何在javascript中将两个大数相加?

    我有两个文本框 每个将接受最多千位数字的输入 现在我想将这两个数字相加 我的问题是我应该使用什么数据类型来存储结果 我已经尝试过这个 但我得到的结果是指数形式的 如何存储结果并显示 这是另一种解决方案 因为它更快 更干净 function
  • Kendo 网格列宽度 + 可滚动

    我正在尝试从 JavaScript 绑定到可滚动剑道网格 但在列宽方面遇到了一些问题 这fiddle http jsfiddle net mnTGm 1 演示了问题 问题末尾的代码 我在 html 中指定标头并向其中一个标头添加宽度 然后
  • 为什么属性初始值设定项不调用自定义设置器?

    来自Kotlin 文档 https kotlinlang org docs reference properties html getters and setters 允许自定义设置器 class Test var stringRepres
  • 新的 ASP.NET Web 应用程序:有一个可以执行某些操作的登录按钮 - 但是,神奇之处在哪里呢?

    请原谅我对这个问题有点缺乏 ASP NET 知识 场景如下 我正在 VS2010 中玩 我创建了一个新的ASP NET Web Application 在 Visual C Web 模板下 没什么特别的 只是一个基本的网络应用程序 没有花哨
  • Django 单元测试:AttributeError:“WSGIRequest”对象没有属性“user”

    运行测试时 我输出以下错误 用户 self request user AttributeError WSGIRequest 对象没有属性 user 我尝试过从MIDDLEWARE to MIDDLEWARE CLASSES反之亦然 目前 我
  • 如何从 Oracle 中的日期中减去小时数,以便它也影响当天

    我正在尝试从 Oracle 中减去日期 这样它甚至也会影响这一天 例如 如果 时间戳是 01 June 2015 00 小时 如果我减去 2 小时 我希望能够转到 31 May 2014 22 小时 I tried to char sysd
  • 使用递归求数组的最小值?

    好吧 所以我一直在尝试用 Java 来理解递归 我可以完成简单的任务 例如求和 反转等 但我一直在努力做这个练习 我试图使用递归找到数组中的最小数字 但始终得到 0 0 的答案 我对递归的理解是 我需要增加一个元素 然后提供一个结束递归的基
  • 如何配置适用于 Node.JS 的 AWS S3 SDK 以与 localhost 一起使用?

    我正在尝试使用fakes3 https github com jubos fake s3作为我编写的一些简单 S3 代码的端点 但我无法超越连接阶段 当前的错误是 NetworkingError getaddrinfo ENOTFOUND
  • gprof 报告没有累积时间

    我正在尝试在运行 OSX 10 5 7 的计算机上使用 gprof 分析 C 应用程序 我以通常的方式使用 g 进行编译 但使用 pg 标志 运行应用程序并尝试使用 gprof 查看调用图 不幸的是 我的调用图包含所有时间列的全零 被调用
  • javadoc从类中排除一些公共方法

    我必须将类的一些公共方法排除在 javadoc 之外 我尝试了 Chris Nokleberg 的 ExcludeDoclet sixlegs 但 doclet 给出了一个小问题 如果类中的其他方法返回 List 或任何其他泛型 返回类型不
  • 使用 powershell 解决程序集依赖关系引用

    我正在尝试使用 PowerShell v4 0 x86 64 针对我们的内部 API 之一来执行一些相当基本的操作 但我似乎无法克服依赖项加载 到目前为止我有 Reflection Assembly LoadFrom C Users Dav