我有一个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有任何建议...... 感谢。
答案 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
我个人没有试过这个,但它看起来和听起来都适合你。