我正在开发一个应用程序,引用并使用某个供应商的一些第三方程序集;在开发机上,我将这3个程序集放在我的源代码树中的一个参考文件夹中,我可以引用它们并构建应用程序,应用程序构建成功,但无法运行,因为整个服务器应用程序没有安装,但这没关系。
在我想要复制此自定义应用程序并运行所有引用的程序集的服务器上,这些程序集都位于类似以下文件夹的位置:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
如果我将我的小型可执行文件复制到该文件夹中并运行它,它可以完美运行,但是如果我将我的.exe文件放在一个更合适的文件夹中,比如我想要的那样:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
由于它无法解析这些程序集,所以它不能工作。
我知道我可以在app.config中使用probing来指定我的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;
}
}