【问题标题】:store dll in another folder not in same project other than bin将dll存储在bin以外的另一个文件夹中
【发布时间】:2010-12-13 11:34:08
【问题描述】:

好的...现在这对我来说是新事物..

我的 bin 文件夹中有一个 utility.dll 文件,我正在当前的应用程序中访问它。这部分工作正常......

public partial class Reports1 : System.Web.UI.Page
{
[DllImport("Utility.dll")]
    public static extern bool GetErrorString(uint lookupCode, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder buf, uint bufSize);
}

但现在我必须使用不在 bin 中的文件夹中的 .dll,而是在 C:/ 中的某个其他文件夹中使用 .dll

我尝试使用注册表键,其中我将文件夹的路径存储在注册表键中并获取该路径并将其放置在 Utility.dll 的位置,但这不起作用....我收到一条错误消息属性必须是属性参数类型的常量表达式......

 public partial class Reports1 : System.Web.UI.Page
{

    private static string PathName
    {
        get
        {
            using (RegistryKey registryKey = Registry.CurrentUser.OpenSubKey(@"Software/Copium"))
            {
                return (string)registryKey.GetValue("BinDir");
            }
        }
    }


    [DllImport(PathName)]
    public static extern bool GetErrorString(uint lookupCode, [MarshalAs(UnmanagedType.LPWStr)] StringBuilder buf, uint bufSize);

大家有什么建议... 谢谢。

【问题讨论】:

    标签: c# asp.net visual-studio dll


    【解决方案1】:

    您可以使用环境变量作为 DllImport 字符串参数常量的一部分吗?这样您就可以从应用程序外部对其进行“参数化”。

    此外,只要 DLL 文件位于当前执行范围的 PATH(环境路径,而不是文件路径)中的某个位置,它就可能是这样的。 (例如 C:\windows\system32。)

    【讨论】:

      【解决方案2】:

      如果它是您要在多个不同程序中使用的 DLL,您可以在全局程序集缓存中注册 DLL。见here

      【讨论】:

        【解决方案3】:

        查看this article 以查看加载程序搜索 DLL 的顺序。

        您也可以使用SetDllDirectory 将自己的路径添加到搜索文件夹,但这可能不适用于DLLImport

        【讨论】:

          【解决方案4】:

          DllImport 属性的Value property 在声明时可能会对此有所了解

          您可以提供完整或相对路径。如果不提供路径,则 DLL 运行时必须在当前路径中 时间,除非 DLL 是由某些人加载的 其他手段。但是请注意, 使用完全限定的路径可以 如果 DLL 是 搬家了。

          但是看到该属性是只读的,我不得不假设它指的是属性构造的路径允许,在这种情况下您可以尝试

          [DllImport(@"C:\mydir\yourdir\theirdir\Utility.dll")]
          

          这只是在黑暗中拍摄,因为我没有尝试过。

          编辑:无论该 DLL 位于何处,请确保它具有要使用的正确文件权限。

          【讨论】:

          • 问题是我无法对路径进行硬编码...因为 dll 可能位于不同的文件夹中...
          【解决方案5】:

          实现此目的的另一种方法可能是结合使用 AppDomain.AssemblyResolve 事件和 Assembly.LoadFrom() 方法,如下所述:http://codebetter.com/blogs/patricksmacchia/archive/2007/07/19/prevent-corrupted-installation-in-production.aspx

          我个人没有尝试过,但它看起来和听起来都适合你。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-09
            相关资源
            最近更新 更多