加载库动态
问题描述:
我有以下项目结构:加载库动态
Web API
- 类库
A
- 类库
B
- 类库
C
这些都是间引用项目
-
Web API
直接引用A
和B
-
B
直接引用C
C
具有需要确保A
加载通过反射,它定义的类型来使用,的方法。
我的代码实际上是类似以下
public class C {
public void MethodCallingBType(string fullClassName) {
//e.g. "MyNamespace.MyType, MyNamespace"
string[] parts = fullClassName.Split(',');
var className = parts[0].Trim();
var assemblyName = parts[1].Trim();
if (!string.IsNullOrEmpty(assemblyName) && !string.IsNullOrEmpty(className)) {
string assemblyFolder = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string assemblyPath = Path.Combine(assemblyFolder, assemblyName + ".dll");
if (File.Exists(assemblyPath)) {
Assembly assembly = Assembly.LoadFrom(assemblyPath);
Type type = assembly.GetType(className);
result = Activator.CreateInstance(type) as IInterfaceRunner;
}
}
}
}
这段代码实际上为Path.GetDirectoryName
函数不返回一个有效的路径是行不通的。除此之外,我想创建一个更好的方法确保B
模块在查找其类型之前加载到内存中。
有什么建议吗?
答
简单的Assembly.Load
不起作用?你不必知道位置,只有名字。
我用同样的情况Assembly.CodeBase
和正常工作:
string codebase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;
Uri p = new Uri(codebase);
string localPath = p.LocalPath;
var myassembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(localPath, "MyAssebmly.dll"));
最好的问候, 彼得
+0
伟大的谢谢你。不知道CodeBase属性成员。 – Lorenzo
检查装配基本目录和私有路径;) – TomTom
@TomTom:组件中都Web Api项目的bin文件夹 – Lorenzo
检查基本目录和私有路径。你没有读过AppDomain的属性吗?有超过GetExecutingAssembly;)他们在那里rae;) – TomTom