[英]Identity Shared between Applications - Identity Framework C#.NET
[英]How to update an assembly shared between .NET Core and .NET Framework applications
我有在 .NET Core 2.1 中开发的应用程序 A 和在 .NET Framework 4.7.1 中开发的应用程序 B。 他们有一个使用 .NET Standard 2.0 开发的共享库/程序集。 这很好用,我可以编译这个库的单个实例并在应用程序 A 和应用程序 B 之间共享它。但这需要每个应用程序 bin 文件夹中的程序集的两个副本。 如果应用程序 A 和应用程序 B 部署在同一台机器上,我想在单个位置更新共享程序集的单个实例,并同时更新应用程序 A 和应用程序 B。 如果应用程序 A 和应用程序 B 使用 .NET Core 而另一个使用 .NET Framework,应用程序 A 和应用程序 B 是否可以在同一位置查找此程序集?
史蒂夫用他的评论为我指明了正确的方向。 这是带有示例的完整答案。 我在 .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 包。 这两个应用程序几乎相同。 这是代码。
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 方法中引用共享库,应用程序会尝试在注册事件处理程序之前加载程序集。
现在,当我编译应用程序并运行它们时,我得到以下输出。
注册解析处理程序...
正在创建共享库...
版本是 1.0.10765
按 Enter 键继续...
现在让我们在 SharedAssemblies 文件夹中放置一个新版本的共享库,并删除与应用程序一起发布的那个。 现在这是输出。
正在创建共享库...
解决 MyLibrary,版本=1.0.10765.0,文化=中性,PublicKeyToken=null
解析到路径 C:...\\SharedLibrary\\SharedAssemblies\\MyLibrary.dll
版本是 1.0.10930
按 Enter 键继续...
核心和框架应用程序的结果相同。 请注意,我们可以将较新版本的程序集放到 SharedAssemblies 文件夹中,它仍然可以正确加载。 这是我正在寻找的允许更新共享库的结果。 现在我可以将它放在一个位置并更新两个应用程序。 但是,如果由于某种原因我只想更新一个应用程序,我仍然可以将所需的版本放在应用程序的 bin 文件夹中。 这是有效的,因为程序集解析器将首先查看本地 bin,如果在那里找不到,则仅从共享位置拉取。
你可以在这个 GitHub 项目上获得所有的源代码来使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.