在运行时根据用户输入动态更改dll
本文关键字:动态 dll 输入 用户 运行时 | 更新日期: 2023-09-27 18:08:59
我必须创建一个c#库来使用一个COM对象的第三方应用程序。目前该应用程序有两个版本版本1(旧)和版本2(新),如下所述,
Version 1 (Sample1.dll)
namespace Sample
{
public interface IApplication
{
string Version { get; }
}
}
Version 2 (Sample2.dll)
namespace Sample
{
public interface IApplication
{
string Version { get; }
}
}
Sample1.dll的ProgID是Sample.Application。Sample2.dll是Sample.Application。分别2。
现在我想在我的项目中引用任何版本的dll并使用IApplication接口。
static void Main(string[] args)
{
int version = 0;
if (int.TryParse(Console.ReadLine(), out version))
{
Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version));
object item = Activator.CreateInstance(comType);
IApplication application = item as IApplication;
Console.WriteLine("Version: {0}", application.Version);
}
}
如果我引用
,上面的代码可以工作1. Sample1.dll and use Sample.Application.1 as ProgID
2. Sample2.dll and use Sample.Application.2 as ProgID
但是我想动态地改变基于ProgID的样例dll并使用IApplication接口。
基本上我想写代码,支持两个版本的dll (Sample1.dll和Sample2.dll)。
最好的解决方案是创建您自己的代理类,您可以在代理的构造函数中指定需要的版本。
在下面的例子中,我使用了更简单的dynamic
,你失去了编译时类型的安全性,但是因为每个成员都应该与代理成员同名,所以很容易复制和粘贴函数或属性名。没有添加Sample1.dll
和Sample2.dll
作为参考
class Program
{
static void Main(string[] args)
{
int version = 0;
if (int.TryParse(Console.ReadLine(), out version))
{
IApplication application = new ApplicationProxy(version);
Console.WriteLine("Version: {0}", application.Version);
}
}
}
/// <summary>
/// A copy of IApplication that is local to your program that holds the shared members.
/// This is what the rest of your program will likely use.
/// </summary>
public interface IApplication
{
string Version { get; }
}
public class ApplicationProxy : IApplication
{
private readonly dynamic _application;
public ApplicationProxy(int version)
{
Type comType = Type.GetTypeFromProgID(String.Format("Sample.Application.{0}", version));
_application = Activator.CreateInstance(comType);
}
public string Version
{
get { return _application.Version; }
}
}
您可以摆脱dynamic
,并添加Sample1.dll
和Sample2.dll
作为引用使用别名,但这将导致更复杂的代码。