2011-05-04 60 views
2

我的问题是试图弄清楚如何从任意位置加载.NET程序集。在我的情况下,我不想使用子目录(排除探测路径方法)或GAC。子目录方法会导致存储多个副本,因为多个调用者使用该程序集。 GAC情景是一个较长期的答案,但在采取这种方法时会发生一些努力。对于Visual Studio 2010,我将GAC用法看作具有以下主要选项:内置安装程序受到了很多批评,InstallShield Limited版本非常好,但似乎并不支持GAC(付费InstallShield版本当然是这样) ,并且WiX被认为具有使用的学习曲线。使用.config文件中的codebase元素从任意路径加载程序集

我提到了关于GAC的所有内容,主要是因为许多问过这个问题的人总是看到GAC的方向。这很令人沮丧,因为代码库元素似乎正是我对强命名调用者和调用程序集所期望的。 我app.config文件看起来是这样的:

<?xml version="1.0"?> 
<configuration> 
    <startup> 

    <supportedRuntime version="v2.0.50727"/></startup> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft.com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="SharedProgramTest" 
          Culture="neutral" 
          PublicKeyToken="c422f85319da5fe0" 
          /> 
     <codeBase version ="1.0.0.1" 
        href="file:///D:/SomewhereElse/SharedProgramTest.dll" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 

感谢, 约翰·维格尔

+0

你什么错误,什么是融合日志的输出? http://bartdesmet.net/blogs/bart/archive/2006/10/23/Assembly-probing_2C00_-Fusion-and-fuslogvw-in-5-minutes.aspx http://blogs.msdn.com/b/thottams /archive/2007/06/02/debugging-load-problems-using-fusion-log.aspx – 2011-06-24 20:30:16

回答

1

不Assembly.LoadFile或Assembly.LoadFrom满足您的要求?

如果不是这样,我想你可以连接到AppDomain.AssemblyResolve事件:
http://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx

+0

尽管你的建议可以和Assembly.LoadFile一起工作,但是移除一个编译时间的依赖关系以支持run时间依赖性。这将意味着使用反射或者动态语言功能来访问所引用的程序集中的类。我的问题真的集中在技术上,它会提供完整的编译时类型检查。 – 2011-06-23 17:24:14

+0

@John,请尝试我的第二个建议,挂接到AppDomain.AssemblyResolve事件以在运行时解析程序集。 – 2011-06-23 21:40:30

+0

我认为你的第二个建议会进入类似的鸡肉和鸡蛋排毒。基于MSDN文档它可以让我处理失败的程序集解决方案。但是,我写的代码将失败,因为此代码运行的AppDomain将无法加载并中止。我认为您的解决方案可以工作,所以我提出了答案,但认为这样做的努力会导致错误的代码。尽管我没有接受答案,因为它不涉及编译时解决方案,请解释我误读了MSDN信息代码库元素,或确认MSDN信息是错误的。 – 2011-06-24 19:37:23

相关问题