首页 > 解决方案 > NET.addAssembly 返回奇怪的可以加载程序集或其依赖项之一

问题描述

在 Matlab 中加载我的一些程序集时,我遇到了一个奇怪的问题:

function [] = foo()
%[
    fold = 'c:\FolderWithAllAssembliesAndDependencies';

    try 
        NET.addAssembly(fullfile(fold, 'MainAssembly.dll')); 
    catch ex
        if (isa(ex, NET.NetException) && isfield(ex.ExceptionObject, 'LoaderExceptions'))
            error(char(ex.ExceptionObject.LoaderExceptions.Get(0).Message));
        else
            rethrow ex;
        end 
    end
%]

返回

Could not find 'SubAssembly, Version=3.0.58.0, Culture=neutral, PublicKeyToken=e33b67d3bb5581e4' or or one of its dependencies. File not found.

但是如果尝试自己加载这个子程序集就可以了:

NET.addAssembly(fullfile(fold, 'SubAssembly.dll')); % No issue !!!

我在 C# 中尝试了一个简单的控制台程序(针对 .NET Framework 4.0),加载主程序集没有问题:

static void Main(string[] args)
{
    Assembly.LoadFrom(@"c:\FolderWithAllAssembliesAndDependencies\MainAssembly.dll"); // Works fine !!!
}

我正在使用 matlab R2015b 和 R2019a,程序集的目标框架如下:

我还尝试将matlab.exe.config文件(在 matlab 安装文件夹中)修改为以下内容:

<configuration>
  <startup useLegacyV2RuntimeActivationPolicy="true">
    <supportedRuntime version="v4.6"/>
    <supportedRuntime version="v4.0"/>
    <supportedRuntime version="v2.0.50727"/>
  </startup>
  <runtime>
    <loadFromRemoteSources enabled="true"/>
  </runtime>
</configuration>

并重新启动matlab,但它仍然无法加载MainAssembly,我看不出有什么问题(即在上面的简单控制台程序中加载MainAssembly没有问题[即使它仅针对.NET framework v4.0])。

标签: .netmatlab

解决方案


    MainAssembly.dll => .NET Standard V2.0
    SubAssembly.dll => .NET Framework v4.6

那行不通(可能)。您的应用程序集从允许更新的 .NET 运行时的 .NET 2.0 上下文开始,然后尝试加载使用 .NET 4.6 编译的程序集。

您可以尝试加载第SubAssembly一个,它应该启动一个 .NET 4.6 上下文,然后加载MainAssembly. 一个更简单的解决方案是MainAssembly使用 .NET 4.6 编译你的。备份声明的来源:由 Microsoft 员工提供的social.msdn.microsoft.com 。

或者可以创建一个使用 .NET 4.6 编译的 .dll 引用您的文件MainAssembly.dll,然后在 Matlab 中加载这个新创建的程序集。

如果你真的想深入研究这个,或者认为这是一个不同的问题,你可以使用fuslogvw。该工具将列出所有绑定请求以及哪些程序集请求了哪些依赖项以及它是否成功。


推荐阅读