将dll存储在另一个不在bin之外的同一项目中的文件夹中

时间:2009-11-05 15:57:58

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

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

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

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中使用其他文件夹:/

我尝试使用registery密钥,其中我将文件夹的路径存储在注册表项中并获取该路径并将其放在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);

Naybody有任何建议...... 感谢。

5 个答案:

答案 0 :(得分:0)

您是否可以将环境变量用作DllImport字符串参数常量的一部分?这样,您就可以从应用程序外部“参数化”它。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

  

您可以提供完整或相对路径。如果你没有提供路径,那么DLL   必须在运行时的当前路径中   时间,除非DLL被某些人加载   其他方式。但请注意   使用完全合格的路径即可   如果DLL是,则引入不准确   移动。

然而,看到该属性是只读的,我必须假设它指的是属性构造的路径容差,在这种情况下你会尝试

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

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

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

答案 4 :(得分:0)

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

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