2013-07-19 16 views
1

我有以下文件夹结构的应用程序:为什么使用Activator.CreateInstance创建的实例不能解析引用?

Application\Modules\XXX 

当然内部XXX任何组件发现XXX内的其他组件。

的问题发生与被实例化用于反射一些实例:

TProvider providerInstance = (TProvider)Activator.CreateInstance(providerType)); 

TProvider有一个返回在另一组件(存储在XXX以及)定义的类的方法。当调用必须加载引用的providerInstance的方法时,即使依赖项位于同一个XXX文件夹中,我也会收到FileNotFoundException有关未找到相关程序集的信息。

看着融合日志组装装载机只检查上的应用程序文件夹,而不是XXX?

为什么发生这种情况,以及如何解决它的任何想法?

谢谢。

+1

程序集加载和您创建对象实例的方式彼此不相关。 ''应该可以帮到你。 – Dennis

+0

@ Dennis:在调用providerInstance的某些方法时,只会解决一些依赖问题。如果providerInstance的方法将返回在另一个程序集上定义的类,该类将仅在首次调用该方法时才被重新解析。如果我使用ActivatorInstance创建实例,则失败。如果我通常创建它的工作。 –

+0

@ Dennis:我不需要这样做,因为所有的程序集都位于同一个文件夹中。 –

回答

3

的原因是,你加载组件,LoadFile方法:

的LoadFile不会将文件加载到LoadFrom上下文,并不使用负载路径不 解决依赖关系,因为LoadFrom方法是否

您应该使用LoadFrom方法和负载从上下文中,或者更好的,如果可能的话,使用Load和负载范围内。

0

要指示CLR的模块\ XXX子目录下探测,使用任何文本编辑器创建一个新的配置文件命名 或applicationname.exe.config使用随机提供的App.config文件,并将文件保存在文件夹中包含 applicationname.exe应用,在这个例子中是Application。

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="Modules\XXX"/> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

说你要指定使用绝对路径或相对一个组件(不在同一个目录层次结构的.exe文件),使用<codebase>代替,反正这两种方法都绑定到XML配置文件的使用。

Assembly.LoadFrom(...)

确实是<codebase>同等学历;可以采取相对和绝对路径

主要参考:临C#5.0和.NET 4.5

2

我加载他们Assembly.LoadFile(文件名)

这是一个很常见的错误。它通常是因为只有LoadFile()有一个体面的MSDN文章不像gobbledegook那样读取,加载上下文在.NET中是一个非常抽象的概念。

只有在故意使用LoadFile()时才会使用不需要需要依赖程序集。这很少见,只有像检查程序集这样的程序才会这样做。像反汇编的工具。

需要LoadFrom()来让CLR也在该目录中查找相关程序集。通常要注意的是,这不是DLLHell的一个有保证的修复,一个类型的身份包含它来自的程序集。在多个程序集中存在具有相同名称空间名称和类型名称的类型时出现问题。一个失败模式,更有可能在一个单独的目录中有一组程序集。特别是当你不控制其内容时,比如插件场景。 Mystifying InvalidCastExceptions可能是您的下一个克星,也是LoadFile()加载的程序集的常见失败模式。程序员喜欢将文件组织成目录,有点OCD,这是一种职业责任,与CLR避免DLL地狱的方式非常不兼容。如果这是插件场景的要求,那么请确保像MEF这样老旧的插件框架来限制意外事故。

+0

感谢Hans。我们所有的开发都在XXX文件夹内,因为我们正在一个拥有PRISM应用程序的大团队中工作,我们的责任始于XXX文件夹并在XXX文件夹中结束。那么当你被限制到一个文件夹时,DLL可能不会发生。 –

相关问题