gpt4 book ai didi

c# - 我可以将引用 dll 放在 C# 的特定目录中吗?

转载 作者:行者123 更新时间:2023-11-30 22:25:37 25 4
gpt4 key购买 nike

我在 32 位计算机上工作,但正在部署到 64 位服务器。

我在一个解决方案中有 5 个项目,如下所示:

  • IHCommon(类库)
    • 引用资料
      • IHLib64(作为一个项目)
      • IHLib32(作为一个项目)
  • IHLib64(类库)
    • 引用资料
      • aLibrary.dll(为 64 位计算机编译的第 3 方 dll)
  • IHLib32(类库)
    • 引用资料
      • aLibrary.dll(为 32 位计算机编译的第 3 方 dll)
  • IHWebUtility(类库)
    • 引用资料
      • IHCommon(作为一个项目)
  • 网站(网络项目)
    • 引用资料
      • IHWebUtility(作为一个项目)

这是我的观点。我的网站应用程序必须运行一些用“aLibrary.dll”编写的函数,所以我设法在 CPU 类型的条件下从“IHCommon”项目调用“IHLib64”或“IHLib32”。

它工作正常。

问题出在网站的 bin 文件夹中,32 位版本的“aLibrary.dll”正在尝试定位,因为 64 位版本的“aLibrary.dll”想要定位。

它们有相同的名字,所以它们不能放在同一个文件夹中。

如何将它们分成单独的文件夹,如 bin\x86 和 bin\x64?

我真正的重点是将它们包含在我的解决方案中,但在 CPU 类型的条件下运行它们。

我曾尝试修复 .csproj 文件,但完全没有成功。

[编辑]我也曾尝试使用 .NET 反射,但我确实无法将其应用于我以前的代码。

转换代码太大。

[编辑] 致丹尼尔

你是说,我必须按如下方式修复这些项目:

  • IHCommon(类库)
    • 动态链接库
      • x86
        • aLibrary.dll(为 32 位计算机编译的第 3 方 dll)
      • x64
        • aLibrary.dll(为 64 位计算机编译的第 3 方 dll)
  • IHWebUtility(类库)
    • 引用资料
      • IHCommon(作为一个项目)
  • 网站(网络项目)
    • 引用资料
      • IHWebUtility(作为一个项目)

最佳答案

在我的一个项目中我遇到了类似的问题:

我想要一个部署包可以在 x86 和 x64 机器上运行而无需任何更改。它还使用为一种 CPU 类型编译的第三方 DLL。我有托管和非托管的第三方 DLL。
x86 的 DLL 位于名为 x86 的子文件夹中,x64 的 DLL 位于名为 x64 的子文件夹中。

非托管 DLL 的方法是在代码真正需要它们之前预加载它们。通过这种方法,我可以决定加载哪个版本:

[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);

void LoadLibraryIfExists(string path)
{
if (File.Exists(path))
LoadLibrary(path);
}

var assembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly();
var path = Path.GetDirectoryName(assembly.Location);
path = Path.Combine(path, Environment.Is64BitProcess ? "x64" : "x86", "unmanaged.dll");

LoadLibraryIfExists(path);

任何稍后执行并需要相同非托管 DLL 的代码都使用上面代码加载的版本。

对于托管程序集,您必须挂接到 AssemblyResolve 事件并自行解析程序集。就像以前一样,您现在可以决定加载哪一个。
使用了以下代码:

AppDomain.CurrentDomain.AssemblyResolve += 
(s, e) => OnAssemblyResolve(Environment.Is64BitProcess, e.Name);

private Assembly LoadAssemblyIfExists(string path)
{
if (!File.Exists(path))
return null;
return Assembly.LoadFrom(path);
}

private Assembly OnAssemblyResolve(bool is64BitProcess, string assemblyDisplayName)
{
try
{
var assemblyName = new AssemblyName(assemblyDisplayName);

if (assemblyName.Name == "Managed")
{
var assembly = Assembly.GetEntryAssembly() ??
Assembly.GetCallingAssembly();
var path = Path.GetDirectoryName(assembly.Location);
path = Path.Combine(path, is64BitProcess ? "x64" : "x86", "Managed.dll");

return LoadAssemblyIfExists(path);
}
}
catch (Exception e)
{
var message = string.Format(
"Error resolving assembly {0}. Falling back to default resolve behavior",
assemblyDisplayName);
Logger.WarnException(message, e);
}

return null;
}

在您的应用程序一开始就执行此代码很重要。

关于c# - 我可以将引用 dll 放在 C# 的特定目录中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12193387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com