我正在尝试使用AppDomain.AssemblyResolve事件来处理异常,同时解析在运行时加载的某些DLL的程序集(SerializedException用于动态加载的Type).
当事件被触发时,我在我的目录中加载所有DLL并创建一个Assembly数组,然后我使用此方法来获取Assembly包含我指定的类型:
public static Assembly GetAssemblyContainingType(String completeTypeName,
Assembly[] assemblies)
{
Assembly assembly = null;
foreach (Assembly currentassembly in assemblies)
{
Type t = currentassembly.GetType(completeTypeName, false, true);
if (t != null)
{
assembly = currentassembly;
break;
}
}
return assembly;
}
Run Code Online (Sandbox Code Playgroud)
问题是这个代码只能用于一个AssemblyQualifiedName,并且ResolveEventArgs.Name事件提供的代码不是那么有用.
你能建议我一些解决方法吗?
有没有办法在事件被触发时传递一些其他参数?
我将我的类的一个实例序列化为一个文件(带有BinaryFormatter)
之后,在另一个项目中,我想反序列化这个文件,但没有成功,因为我的新项目没有我旧类的描述。在.Deserialize()收到一个异常
Unable to find assembly '*MyAssembly, Version=1.9.0.0, Culture=neutral, PublicKeyToken=null'.*".
Run Code Online (Sandbox Code Playgroud)
但是我有包含我想要反序列化的旧类的描述的程序集的 .DLL。
我不想在项目中添加对 this DLL 的引用(我希望能够反序列化任何类型程序集的类......)
如何通知序列化器/反序列化器使用我动态加载的程序集?
我正在开发一个引用并使用来自某个供应商的某些第三方程序集的应用程序; 在开发框中我在源代码树的参考文件夹中有这3个程序集,我可以引用它们并构建应用程序,应用程序构建但不运行,因为没有安装整个服务器应用程序,但这很好.
在我想要复制此自定义应用程序并运行我引用的所有程序集的服务器上的文件夹类似于:
D:\ProgramFiles\VendorName\ProductName\Support\API\Bin64
Run Code Online (Sandbox Code Playgroud)
如果我在该文件夹中复制我的小可执行文件并运行它,它可以正常工作,但如果我把我的.exe放在一个更合适的文件夹中,就像我想要的那样:
D:\ProgramFiles\MyCompanyName\MyProduct\bin\...
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为它无法解析这些程序集.
我知道我可以在app.config中使用探测来指定我的exe必须查找引用的文件夹,但imy情况下程序集不在子文件夹中,更多在完全不同的位置.
我不想复制我的应用程序文件夹中的所有供应商程序集,我不能只放在那里我引用的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 …Run Code Online (Sandbox Code Playgroud)