C# 对于控制台应用程序,是否可以将DLL部署到独立于可执行文件的目录?

C# 对于控制台应用程序,是否可以将DLL部署到独立于可执行文件的目录?,c#,.net,dll,console-application,C#,.net,Dll,Console Application,在.NETC控制台应用程序中是否有方法将可执行文件部署到与其所依赖的DLL不同的目录 在本例中,我希望对部署进行结构化,以便在运行部署的服务器上具有以下目录结构。 c:\app\bin\sample.exe c:\app\dll*.dll您可以更改dll的输出路径,以便将它们放入默认路径以外的路径中。这是在项目设计器的构建页面中完成的 请参阅以下文章:您可以更改DLL的输出路径,以便将它们放入默认路径以外的路径中。这是在项目设计器的构建页面中完成的 请参阅以下文章:您始终可以使用Assembly

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

在本例中,我希望对部署进行结构化,以便在运行部署的服务器上具有以下目录结构。 c:\app\bin\sample.exe
c:\app\dll*.dll

您可以更改dll的输出路径,以便将它们放入默认路径以外的路径中。这是在项目设计器的构建页面中完成的


请参阅以下文章:

您可以更改DLL的输出路径,以便将它们放入默认路径以外的路径中。这是在项目设计器的构建页面中完成的


请参阅以下文章:

您始终可以使用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;
}

每次找不到文件位置时,都会调用该方法。另一个选项是在程序属性页的“引用路径”部分指定目录。

您始终可以使用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;
}

每次找不到文件位置时,都会调用该方法。另一个选项是在程序属性页的“引用路径”部分指定目录。

一个解决方案可能是将DLL部署到GAC全局程序集缓存。这样,应用程序将从GAC加载它们,而不是从应用程序目录加载它们。

一种解决方案可能是将DLL部署到GAC全局程序集缓存。这样,应用程序将从GAC加载它们,而不是从应用程序目录加载它们。

这是相当不明智的,CLR无法在没有帮助的情况下找到DLL。您的客户不会太在意DLL的位置。事实上,我认为大多数IT人员更喜欢相同目录中的二进制文件


如果将DLL放在c:\app\bin\DLL子目录中,则可以使用带有元素的app.exe.config文件来通知CLR在该目录中查找。部署到c:\app\dll要困难得多,它需要一个非常不实用的应用程序。这使得应用程序不可移动,而更喜欢Pierre的解决方案。除了需要工作之外,您还希望使用Assembly.GetEntryAssembly.Location获取EXE的安装路径,以便可以从中生成相对路径。

这是相当不明智的,CLR无法在没有帮助的情况下找到DLL。您的客户不会太在意DLL的位置。事实上,我认为大多数IT人员更喜欢相同目录中的二进制文件


如果将DLL放在c:\app\bin\DLL子目录中,则可以使用带有元素的app.exe.config文件来通知CLR在该目录中查找。部署到c:\app\dll要困难得多,它需要一个非常不实用的应用程序。这使得应用程序不可移动,而更喜欢Pierre的解决方案。除了需要工作之外,您还需要使用Assembly.GetEntryAssembly.Location获取EXE的安装路径,以便可以从中生成相对路径。

这将无法正常工作。也许您可以通过向OP展示如何使用Assembly.GetEntryAssembly.Location生成正确的路径来提供帮助。不,它不会像发布的那样工作,因为文件名没有声明。。。您所要做的就是将fileName定义为DLL的位置。你可以使用Assembly.GetExecutionGassembly来获取EXE的位置,而不是找到DLLBy的相对位置。顺便说一下,我同意Hans post的说法,这不是最好的主意。。。我为我的一个项目做了类似的事情,它造成了一系列的问题,包括安全问题,这是一个真正的痛苦…这不会像张贴的那样工作。也许您可以通过向OP展示如何使用Assembly.GetEntryAssembly.Location生成正确的路径来提供帮助。不,它不会像发布的那样工作,因为文件名没有声明。。。您所要做的就是将fileName定义为DLL的位置。你可以使用Assembly.GetExecutionGassembly来获取EXE的位置,而不是找到DLLBy的相对位置。顺便说一下,我同意Hans post的说法,这不是最好的主意。。。我为我的一个项目做了类似的事情,它产生了一系列问题,包括安全问题,这是一个真正的痛苦…我不知道有能力为应用程序定义一个位置来搜索DLL的通过。考虑到将程序集移到应用程序目录之外可能导致的问题,这听起来是一个更好的解决方案。谢谢你的帮助。我不知道如何定义应用程序的位置来搜索DLL的via。考虑到将程序集移到应用程序目录之外可能导致的问题,这听起来是一个更好的解决方案。谢谢你的帮助。