标签: .net-assembly

在之前看到相同的绑定后不加载程序集,并且失败并显示 hr = 0x80070002'

我看到一个奇怪的问题,一旦程序集无法加载,它就不会从具有相同父进程的不同进程加载。假设 Parent.exe 首先创建 Child1.exe,并尝试使用以下命令加载程序集

Type.GetType("TypeName, AssemblyName1") 
Run Code Online (Sandbox Code Playgroud)

它失败,因为程序集不在探测路径中。我收到预期的警告:

WRN:为程序集提供了部分绑定信息

但是,当 Parent.exe 创建 Child2.exe 并且 AssemblyName1 位于其探测路径中时,它仍然无法加载 AssemblyName1。Fusion 日志显示它甚至没有尝试探测并给出错误消息

日志:之前看到过相同的绑定,但失败,hr = 0x80070002

我看到这个是因为 Child1.exe 和 Child2.exe 都是从 Parent.exe 创建的吗?

我很困惑。我了解加载上下文在应用程序域中共享,但我从未见过跨进程共享加载失败缓存。也许我误诊了?

.net c# .net-assembly

5
推荐指数
0
解决办法
1698
查看次数

dotnet core,将依赖项复制到构建时的输出目录

我目前正在开发一个 .net (dotnet) 核心控制台应用程序 (app),它应该从/plugins/文件夹加载插件。

这些插件引用了一个名为的内部项目,Data该项目为实体框架 v2.0.1 提供了上下文实现。该项目是使用 nuget 包的参考。

当我运行我的应用程序时,我得到以下调试输出(反射异常)

  • 无法加载文件或程序集“Microsoft.EntityFrameworkCore,版本=2.0.1.0,文化=中性,PublicKeyToken=adb9793829ddae60”。该系统找不到指定的文件。

Microsoft.EntityFrameworkCore.dll在此路径中找到了一个文件C:\Users\Tobias\.nuget\packages\microsoft.entityframeworkcore\2.0.1\lib\netstandard2.0\Microsoft.EntityFrameworkCore.dll,并将其复制到插件文件夹中。

复制文件后,异常消失了,但发生了许多其他依赖项错误:

  • 无法加载文件或程序集“System.Interactive.Async,Version=3.0.3000.0,Culture=neutral,PublicKeyToken=94bc3704cddfc263”。该系统找不到指定的文件。
  • 无法加载文件或程序集“System.Interactive.Async,Version=3.0.3000.0,Culture=neutral,PublicKeyToken=94bc3704cddfc263”。该系统找不到指定的文件。
  • 无法加载文件或程序集“Remotion.Linq,版本=2.1.0.0,文化=中性,PublicKeyToken=fee00910d6e5f53b”。该系统找不到指定的文件。
  • 无法加载文件或程序集“Remotion.Linq,版本=2.1.0.0,文化=中性,PublicKeyToken=fee00910d6e5f53b”。该系统找不到指定的文件。
  • 无法加载文件或程序集“Remotion.Linq,版本=2.1.0.0,文化=中性,PublicKeyToken=fee00910d6e5f53b”。该系统找不到指定的文件。
  • ...(大约~90多个)

我不想手动复制所有这些参考文献,而且我认为我不必这样做。

有没有办法复制 Visual Studio 中构建的所有依赖项?或者也许使用cmd和dotnet命令?

到目前为止我找不到任何帮助

.net c# .net-assembly build-dependencies .net-core

5
推荐指数
0
解决办法
1750
查看次数

Visual Studio 2017 使用旧的 Nuget 包而不是程序集引用

我有一个正在开发的公共库。我们称之为 My.Common。

My.Common 的版本 1 已上传到我的 Intranet Nuget 服务器,并在其他几个库中使用,例如 My.Logging 和 My.Navigation。

在开发通过 Nuget 使用 My.Common、My.Logging 和 My.Navigation 的 .Net Core 应用程序时,我发现了 My.Common 中的一个错误。因此,我需要修复版本 2 的 My.Common。该错误影响应用程序直接使用的功能 - 它对其他库没有影响,它们可以继续使用版本 1。

我打开 My.Common 的代码,尝试修复并编译。在应用程序中,我删除了 My.Common 的 Nuget 包,并在其 bin 文件夹中添加了对 My.Common DLL 的引用。

这时我发现我在应用程序中没有看到 My.Common 的更改。在 My.Common 的“属性”窗口中,路径显示为:

C:\Users\foo\.nuget\packages\my.common\1.0.0\lib\netcoreapp2.0\My.Common.dll
Run Code Online (Sandbox Code Playgroud)

以下是 .csproj 中的引用的外观:

  <ItemGroup>
    <Reference Include="My.Common">
      <HintPath>C:\Projects\My.Common\bin\Debug\netcoreapp2.0\My.Common.dll</HintPath>
    </Reference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

尽管我已将其添加为程序集引用,但它正在被覆盖并从其 Nuget 包中提供!

由于程序集和 Nuget 包有不同的版本,我想我可以通过更明确地了解版本来解决这个问题。

  <ItemGroup>
    <Reference Include="My.Common, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null">
      <HintPath>C:\Projects\My.Common\bin\Debug\netcoreapp2.0\My.Common.dll</HintPath>
      <SpecificVersion>true</SpecificVersion>
    </Reference>
  </ItemGroup>
Run Code Online (Sandbox Code Playgroud)

当设置为 true 时,Visual Studio 似乎根本无法找到程序集 - 属性中的路径为空,并且应用程序填充“(您是否缺少程序集引用?)”错误。 …

.net-assembly visual-studio nuget .net-core visual-studio-2017

5
推荐指数
1
解决办法
3012
查看次数

有没有办法确定 .NET 程序集是否使用“确定性”标志进行编译?

我正在使用此答案中的代码来获取 .NET 程序集的链接器时间戳。

但是,如果程序集被编译为“确定性”,则该值并不是构建程序集的准确时间(参考),因此我想忽略它。

PE 标头(或程序集的任何其他部分)中是否有任何信息表明它已构建为“确定性”?

.net .net-assembly portable-executable

5
推荐指数
1
解决办法
278
查看次数

C# 无法加载文件或程序集:NuGet

有办法解决这个问题吗?

\n\n

我刚刚创建了一个新项目,我想使用 System.IO.Pipes\n我使用 NuGet 安装 System.IO.Pipes 包,他是我的参考目录,但是当我尝试构建时,我有:

\n\n

无法加载文件或程序集“System.IO.Pipes,版本=4.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”。文件 sp\xc3\xa9cifi\xc3\xa9 是很麻烦的。

\n\n

有解决这个问题的想法吗?

\n\n

谢谢

\n

c# pipe named-pipes .net-assembly visual-studio

5
推荐指数
1
解决办法
2万
查看次数

AssemblyLoadContext,动态加载程序集,实例化对象并转换为共享接口

我试图加载一个程序集AssemblyLoadContext(从 netcore 3.0 版本开始存在),实例化一个对象并将该对象转换为接口,但出现转换异常错误。

该接口在加载程序集的项目和实例化的实现之间共享。该对象显然已正确实例化,但在实例化时出现意外错误(T)instance

尝试使用观察者,我能够按照我正在使用的代码和观察者的屏幕截图将实例正确地投射到界面:

private (ExecutionAssemblyLoadContext, T) LoadTheAssemblyAndInstance<T>(string assemblyName, string typeNameToInstance)
{
    var basePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
    var assemblyContext = new ExecutionAssemblyLoadContext($"{basePath}/{assemblyName}.dll");
    var assembly = assemblyContext.LoadFromAssemblyPath($"{basePath}/{assemblyName}.dll");
    var externalCodeEvent = typeNameToInstance != null ? assembly.ExportedTypes
        .Where(x => x.FullName == typeNameToInstance)
        .Single() : assembly.ExportedTypes.First();
    var instance = Activator.CreateInstance(
            externalCodeEvent,
            _defaultConstructorParameters
        );
    return (assemblyContext, (T)instance);
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

这是完整的异常消息:

System.InvalidCastException:“无法将类型为“Expriva.NewWorkflow.BPMN.ExecutionCodeTest.ExecutionContractTest”的对象转换为类型为“Expriva.NewWorkflow.ExternalShared.Interfaces.IExecutionContract”。”

下面的屏幕截图显示了该T实例的实现:

在此输入图像描述

示例代码

GitHub 上添加了一个示例存储库,以便更轻松地查看和测试问题所在。如果有一种方法可以透明地使用该类型(其他接口),无论它是否从 AssmemblyLoadContext 加载,那就太好了。

.net c# .net-assembly .net-core .net-core-3.0

5
推荐指数
1
解决办法
3129
查看次数

如何使用 .NET Reactor 混淆包含多个附属程序集的 .NET Core 3 程序集?

我有一个用 .NET Reactor v.6.0.0.0 混淆的 .NET Core 3.0.100 程序集。

所述主程序集依赖于已通过使用 Reactor命令与其一起打包和混淆的附加程序集:
-satelite_assemblies [path/s]
-merge 1

使用 dotPeek 并反编译程序集,我可以看到所有正确的 .dll 都包含在主程序集中,并与其一起混淆 - 到目前为止一切顺利。

仅构建(且未混淆)时,主 .dll 还具有一个与之一起的 [name].deps.json 文件,该文件告诉它在什么位置以及在哪里可以找到附加程序集(标准 .NET Core 过程)。

在混淆的程序集(包含所有其余部分)中,该文件不再有效(也无法包含),因为程序集的“位置”现在已更改,因此在运行混淆的 .dll 时,我们在控制台中收到错误消息找不到依赖的 .dll。

我们如何使用 .NET Reactor 混淆和合并多个 .dll,并且仍然让主程序集知道在哪里找到它们?

  • 是否需要手动更改 [name].deps.json,如果需要,是什么类型的更改?
  • 有没有办法使用 .NET Reactor 自动指定它或以某种方式包含它(-satellite_assemblies 仅接受 .dll 和 .exe 文件)?
  • 当依赖 [name].deps.json 文件时, 是否只能对它们进行混淆而不合并它们?

c# obfuscation .net-assembly net-reactor .net-core

5
推荐指数
1
解决办法
2424
查看次数

拥有两个不同的依赖程序集但具有相同的公钥令牌是否正常?

System.IO.FileSystem.Primitives -> b03f5f7f11d50a3a

System.Runtime.CompilerServices.Unsafe -> b03f5f7f11d50a3a

<dependentAssembly>
            <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.6.0" newVersion="4.0.6.0" />
</dependentAssembly>
Run Code Online (Sandbox Code Playgroud)

我有这个错误:

具有相同标识“ System.IO.FileSystem.Primitives , Version=4.0.2.0, Culture=neutral, PublicKeyToken= b03f5f7f11d50a3a ”的程序集已导入。尝试删除重复的引用之一。

c# asp.net model-view-controller strongname .net-assembly

5
推荐指数
1
解决办法
463
查看次数

为什么我的命名空间引用在 Visual Studio 中不断中断?

我在Unity 论坛上提出了这个问题,但不幸的是没有回复。由于这似乎是 Visual Studio 本身的错误/问题,我也在这里询问。

情况

我无法在 Visual Studio 中编译我的项目代码。它仍然可以在 Unity 编辑器中编译和运行,但 Visual Studio 会给出数百个缺失引用错误(“找不到类型或命名空间名称 'XXX'(是否缺少 using 指令或程序集引用?)”)。这包括我编写的但位于另一个程序集中的文件,即我自己创建的命名空间。

除了一件事之外,我尝试过的所有方法都不起作用(见下文)。如果我手动删除对 Visual Studio 中所有四个程序集的引用并重新添加它们,解决方案将进行编译。但是当我关闭 VS 并重新打开时,会出现相同的错误。通过更多测试,我发现有时(不知道是什么触发了它)引用甚至会在不关闭 Visual Studio 的情况下中断。

这些程序集是 Assembly-CSharp、Assembly-CSharp-Editor、Assembly-CSharp-Editor-firstpass 和 Assembly-CSharp-firstpass;使用 Unity 项目创建的普通项目。现在在程序集中未正确引用的脚本以前没有引起任何问题,而且我根本没有更改它们。我不知道我会做什么,现在却导致了这个问题。以前这些脚本没有出现任何错误;前一秒他们编译得很好,下一秒就出现了这些错误。


版本

Unity 2019.3.12f1 个人版。

Visual Studio 社区 2017 15.9.22。


我试过了:

c# .net-assembly unity-game-engine visual-studio visual-studio-2017

5
推荐指数
1
解决办法
5272
查看次数

.NET 5 升级导致“程序集未强命名或被篡改”异常

我已将 WPF 项目从 .NET core 3.1 升级到 5。我在加载第 3 方 DLL 之一时开始出现错误。我看到以下错误:

InnerException = {“程序集“Abt.Controls.SciChart.Wpf.2.32”的强名称验证失败。程序集未强命名或已被篡改。通过 API 验证失败。”}

如果我通过 sn.exe 检查程序集,我会发现它已经过验证。我对 .NET Core 3.1 没有任何疑问。在阅读 NET 5 的发行说明后,我找不到任何原因。有没有办法摆脱这个异常?

在此输入图像描述

.net c# .net-assembly .net-5

5
推荐指数
0
解决办法
348
查看次数