gpt4 book ai didi

c# - 从另一个文件夹解析程序集引用

转载 作者:太空狗 更新时间:2023-10-29 20:06:02 27 4
gpt4 key购买 nike

我正在开发一个应用程序,该应用程序引用并使用来自某个供应商的一些第三方程序集;在开发框中,我在源代码树的引用文件夹中有这 3 个程序集,我可以引用它们并构建应用程序,应用程序构建但不运行,因为没有安装整个服务器应用程序,但这很好。

在我要复制此自定义应用程序并运行我引用的所有程序集的服务器上,文件夹如下所示:

D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64

如果我将我的小可执行文件复制到该文件夹​​并运行它,它会完美运行,但如果我将我的 .exe 放在我想要的更合适的文件夹中:

D:\ProgramFiles\MyCompanyName\MyProduct\bin\...

它不起作用,因为它无法解析这些程序集。

我知道我可以在 app.config 中使用探测来指定我的 exe 必须在哪些文件夹中查找引用,但我的情况是程序集不在子文件夹中,而是在完全不同的位置。

我不想将所有供应商程序集复制到我的应用程序文件夹中,我不能只将我引用的 3 个程序集放在那里,因为它们也在加载其他程序集,除非我拥有所有这些程序集(很多...),它不起作用。

我没有做任何特别的事情,没有创建应用程序域,也没有通过反射加载程序集,只是希望 CLR 在应用程序启动或执行时需要解析引用。

谢谢。

编辑:这里是最终的工作代码

static System.Reflection.Assembly currentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Logger logger = new Logger();

try
{
string RMSAssemblyFolder = ConfigurationManager.AppSettings["RMSAssemblyFolder"];

Assembly MyAssembly = null;
string strTempAssmbPath = string.Empty;

Assembly objExecutingAssemblies = Assembly.GetExecutingAssembly();
AssemblyName[] arrReferencedAssmbNames = objExecutingAssemblies.GetReferencedAssemblies();

AssemblyName myAssemblyName = Array.Find<AssemblyName>(arrReferencedAssmbNames, a => a.Name == args.Name);

if (myAssemblyName != null)
{
MyAssembly = Assembly.LoadFrom(myAssemblyName.CodeBase);
}
else
{
strTempAssmbPath = Path.Combine(RMSAssemblyFolder, args.Name.Substring(0, args.Name.IndexOf(",")) + ".dll");

if (!string.IsNullOrEmpty(strTempAssmbPath))
{
if (File.Exists(strTempAssmbPath))
{
logger.Information("Assembly to load: {0} - File was found in: {1}", args.Name, strTempAssmbPath);

// Loads the assembly from the specified path.
MyAssembly = Assembly.LoadFrom(strTempAssmbPath);
}
}
}

// Returns the loaded assembly.
return MyAssembly;
}
catch (Exception exc)
{
logger.Error(exc);
return null;
}
}

最佳答案

您应该首先找到安装这些 dll 的文件夹,然后使用 AppDomain.AssemblyResolve Hook 程序集解析并尝试从此文件夹加载请求的程序集。

它看起来像这样(未经测试,您需要检查 args.Name 究竟包含什么,可能包含版本和强名称以及类型名称):

var otherCompanyDlls = new DirectoryInfo(companyFolder).GetFiles("*.dll");

AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
{
var dll = otherCompanyDlls.FirstOrDefault(fi => fi.Name == args.Name);
if (dll == null)
{
return null;
}

return Assembly.Load(dll.FullName);
};

关于c# - 从另一个文件夹解析程序集引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5260404/

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