Belirli bir Satıcıdan bazı üçüncü parti meclislerini referans gösteren ve kullanan bir uygulama geliştiriyorum; geliştirme kutusunda kaynak ağacımda bir referans klasöründe bu 3 derlemeler var ve bunları başvuruda bulunabilir ve uygulamayı yapılandırabilir, uygulama oluşturur, ancak tüm sunucu uygulaması yüklü olmadığından çalışmaz, ancak bu iyi. Bu özel bir uygulama kopyalamak ve referans ediyorum tüm montajlar gibi klasör şey vardır çalıştırmak istediğiniz sunucudaBaşka bir klasördeki montaj referanslarını çözün
:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
ve ben bu klasöre benim küçük yürütülebilir kopyalayıp, bunu çalıştırmak eğer mükemmel çalışıyor ama ben gibi daha uygun bir klasöre benim .exe koyarsanız istiyorum:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
çalışmıyor bu o meclisleri çözülemiyor çünkü.
Biliyorum, exe'm referansları aramasını istediğiniz klasörleri belirtmek için app.config'te probu kullanabiliyorum, ancak derlemeler, bir alt klasörde değil, tamamen farklı bir konumda.
Tüm satıcı derlemelerini uygulama klasörümde kopyalamak istemiyorum ve yalnızca referanslarımı gönderemediğim 3 tane koyamıyorum çünkü bunlar başka meclisleri de yüklüyorlar ve hepsine sahip olmadıkça (birçok ...) , İşe yaramıyor.
Özel bir şey yapmıyorum, uygulama etki alanları oluşturmuyorum ve yansıtma yoluyla derlemeleri yüklemiyorum, sadece CLR'nin başvuruları başlatma veya yürütme sırasında gerektikçe başvuruları çözmesi için istiyorum.
Teşekkürler.
Düzenleme: Burada nihai çalışma kodu
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;
}
}
olası yinelenen http://stackoverflow.com/questions/1373100/how-to-add-folder-to-assembly-search-path-at-runtime-in-net – nawfal