在.NET C#控制台应用程序中是否有办法将可执行文件部署到与其依赖的DLL不同的目录?
在这种情况下,我想构建我的部署,以便在运行它的服务器上,我有以下目录结构。 C:\程序\ BIN \ SAMPLE.EXE c:\ app \ dll * .dll
答案 0 :(得分:4)
这是不明智的,CLR无法在没有帮助的情况下找不到DLL。您的客户不会太在意DLL的位置。事实上,我认为大多数IT人员更喜欢同一目录中的二进制文件。
如果将DLL放在c:\app\bin\dll
子目录中,则可以使用app.exe.config
文件和<probing>
元素来告诉CLR查看该目录。部署到c:\app\dll
要困难得多,它需要<codeBase>
中非常不实用的<dependentAssembly>
。这使得应用程序无法移动,而不是Pierre的解决方案。除了它需要工作之外,您希望使用Assembly.GetEntryAssembly().Location
来获取EXE的安装路径,以便您可以生成相对路径。
答案 1 :(得分:2)
您始终可以使用AssemblyResolveEvent指定任何程序集的位置,如下所示:
public static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
//do something
}
private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
Assembly.LoadFrom(fileName); // Load assembly from any file
return assembly;
}
每次找不到文件的位置时都会调用该方法。另一个选择是在程序属性页的“参考路径”部分指定一个目录。
答案 2 :(得分:0)
您可以更改DLL的输出路径,以便将它们放入默认路径以外的路径中。这是在项目设计器的 Build 页面中完成的。
请参阅以下文章:http://msdn.microsoft.com/en-us/library/kb4wyys2%28VS.80%29.aspx
答案 3 :(得分:0)
一种解决方案可能是将您的DLL部署到GAC,全局程序集缓存。这样,您的应用程序将从GAC加载它们,而不是从应用程序目录加载它们。