是否可以将DLL部署到单独的目录而不是控制台应用程序的可执行文件?

时间:2010-09-20 20:27:42

标签: c# .net dll console-application

在.NET C#控制台应用程序中是否有办法将可执行文件部署到与其依赖的DLL不同的目录?

在这种情况下,我想构建我的部署,以便在运行它的服务器上,我有以下目录结构。    C:\程序\ BIN \ SAMPLE.EXE    c:\ app \ dll * .dll

4 个答案:

答案 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加载它们,而不是从应用程序目录加载它们。