c# – 如何在.NET Core和.NET Framework应用程序之间共享程序集

c# – 如何在.NET Core和.NET Framework应用程序之间共享程序集,第1张

概述我有在.NET Core 2.1和.NET Framework 4.7.1中开发的应用程序B中开发的应用程序A.它们具有使用.NET Standard 2.0开发的共享库/程序集.这很好用,我可以编译这个库的单个实例并在Application A和Application B之间共享它.但是这需要在每个应用程序bin文件夹中有两个程序集副本.如果应用程序A和应用程序B部署在同一台机器上,我想在一个位 我有在.NET Core 2.1和.NET Framework 4.7.1中开发的应用程序B中开发的应用程序A.它们具有使用.NET Standard 2.0开发的共享库/程序集.这很好用,我可以编译这个库的单个实例并在Application A和Application B之间共享它.但是这需要在每个应用程序bin文件夹中有两个程序集副本.如果应用程序A和应用程序B部署在同一台机器上,我想在一个位置更新共享程序集的单个实例,并更新应用程序A和应用程序B.有没有一种方法,应用程序A和应用程序B可以在此程序集的相同位置查看,因为一个使用.NET Core而另一个使用.NET Framework?解决方法 史蒂夫用他的评论向我指出了正确的方向.以下是完整的答案和示例.我在.NET Core和.NET Framework中编写了一个调用共享库的简单控制台应用程序.该库只返回要在控制台应用程序中显示的库的版本号.正如您将看到的,这将使测试更容易.这是所有共享库的功能.

using System.Diagnostics;namespace Mylibrary{    /// <summary>    /// This is a shared library that returns the assemblIEs version    /// </summary>    public class Sharedlib    {        public string GetProductVersion()        {            System.Reflection.Assembly assembly =               System.Reflection.Assembly.GetExecutingAssembly();            FiLeversionInfo fvi = FiLeversionInfo.GetVersionInfo(assembly.Location);            string version = fvi.ProductVersion;            return version;        }    } }

共享库的编译目标是.net标准2.0.对于我的测试,我在本地NuGet服务器上将其作为NuGet包发布.然后,我将NuGet包包含在Core和Framework Applications中.两个应用程序几乎完全相同.这是代码.

class Program{    static voID Main(string[] args)    {        Console.Writeline("Registering Resolving Handler...");        AppDomain.CurrentDomain.AssemblyResolve += MyHandler;        Console.Writeline("Creating shared library...");        SharedlibWrapper sharedlib = new SharedlibWrapper();        Console.Writeline("The version is {0}",sharedlib.Version);        Console.Writeline("Press Enter key to continue...");        Console.Readline();    }    static string GetSharedAssemblyPath()    {        string relativePath = @"..\..\..\SharedAssemblIEs\";        return Path.GetFullPath(relativePath);    }    static Assembly MyHandler(object source,ResolveEventArgs e)    {        Console.Writeline("Resolving {0}",e.name);        if (e.name.Contains("Mylibrary"))        {            string path = GetSharedAssemblyPath() + @"Mylibrary.dll";            Console.Writeline("Resolving to path {0}",path);            return Assembly.Loadfile(path);        }        return null;    }}

此代码添加了一个AssemblyResolve处理程序,以便在应用程序找不到程序集的情况下,处理程序将尝试解析它.在这种情况下,我将两个应用程序都放在位于解决方案根目录下的SharedAssemblIEs文件夹中.

您会注意到我将共享库放在类包装器中.这是我能够使解决方案工作的唯一方法.如果我直接在Main方法中引用了共享库,则应用程序会在注册事件处理程序之前尝试加载程序集.

现在,当我编译应用程序并运行它们时,我得到以下输出.

Registering Resolving Handler…

Creating shared library…

The version is 1.0.10765

Press Enter key to continue…

现在,我们将共享库的新版本放在SharedAssemblIEs文件夹中,并删除随应用程序发布的版本.现在这是输出.

Creating shared library…

Resolving Mylibrary,Version=1.0.10765.0,Culture=neutral,
PublicKeyToken=null

Resolving to path C:…\Sharedlibrary\SharedAssemblIEs\Mylibrary.dll

The version is 1.0.10930

Press Enter key to continue…

核心和框架应用程序的结果相同.请注意,我们可以在SharedAssemblIEs文件夹中删除较新版本的程序集,但仍然可以正确加载.这是我正在寻找允许更新共享库的结果.现在我可以将它放在一个位置并更新两个应用程序.但是,如果我只想出于某种原因只更新一个应用程序,我仍然可以将所需的版本放在应用程序的bin文件夹中.这是有效的,因为程序集解析器将首先查看本地bin,如果在那里找不到,则只从共享位置拉出.

你可以在this GitHub project获得所有的源代码.

总结

以上是内存溢出为你收集整理的c# – 如何在.NET Core和.NET Framework应用程序之间共享程序集全部内容,希望文章能够帮你解决c# – 如何在.NET Core和.NET Framework应用程序之间共享程序集所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存