我遇到了使用Sybase驱动程序的问题。当Sybase尝试创建连接时,我得到以下内容。
[AseException: Could not load C:\Windows\TEMP\Sybase.AdoNet4.AseClient.32bits.4.157.501.0\sbgse2.dll]
Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(String dirName, String dllName, Int32 bits) +419
Sybase.Data.AseClient1.AseConnection.LoadLibraries() +243
Sybase.Data.AseClient1.AseConnection..cctor() +5
[TypeInitializationException: The type initializer for 'Sybase.Data.AseClient1.AseConnection' threw an exception.]
Sybase.Data.AseClient1.AseConnection..ctor(AseConnection realConnection) +0
Sybase.Data.AseClient.AseConnection..ctor() +27
我看到Sybase将一些非托管代码编译为嵌入式资源,然后在运行时如果这些文件不在临时目录中,则将其复制到那里。
在我的情况下,我看到文件确实存在。我甚至可以删除它们并看到它们在运行时被复制回来。
我现在难以理解为什么他们无法加载。
这台机器一次运行.net 4.5。它已卸载并重新安装.net 4.0。不确定与它有什么关系。
以下是Sybase驱动程序中的相关代码
private static void LoadLibraries()
{
int bits = IntPtr.Size * 8;
string str = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name + "." + bits.ToString() + "bits." + ((object) Assembly.GetExecutingAssembly().GetName().Version).ToString());
if (!Directory.Exists(str))
Directory.CreateDirectory(str);
Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(str, "sbgse2.dll", bits);
Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(str, "sybdrvado20.dll", bits);
}
private static void SaveAndLoadLibrary(string dirName, string dllName, int bits)
{
string str = Path.Combine(dirName, dllName);
if (!File.Exists(str))
{
using (Stream manifestResourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Sybase.Data.AseClient.Resources._" + bits.ToString() + "bits." + dllName))
{
try
{
using (Stream stream = (Stream) File.Create(str))
{
byte[] buffer = new byte[4096];
while (true)
{
int count = manifestResourceStream.Read(buffer, 0, 4096);
if (count >= 1)
stream.Write(buffer, 0, count);
else
break;
}
stream.Close();
}
}
catch
{
}
}
}
if (Sybase.Data.AseClient1.AseConnection.LoadLibrary(str) == IntPtr.Zero)
throw new AseException("Could not load " + str);
}
[DllImport("kernel32.dll")]
public static IntPtr LoadLibrary(string dllToLoad);
有什么想法或想法吗?
答案 0 :(得分:1)
出现(出于某种原因)复制到c:\ windows \ temp的文件从AppPool获取了特殊权限,其中此代码已初始化,导致其他应用程序池无法读取该文件。为此,我原本期望一个Access Denied类型例外。
它仍然有点魔力和挥手充其量,但从文件中删除应用程序池的特殊权限,删除临时目录,并重新启动使错误应用程序(在不同的应用程序池中)保持抛出此例外。特殊权限也没有再出现在临时文件中。
答案 1 :(得分:0)
由于所有应用程序池标识都必须位于IIS工作进程组中,因此解决方案是将 修改 权限授予 C:\ Windows \ TEMP IIS组的文件夹:
将正确继承权限(在Windows Server 2008和IIS 7上进行验证)。
答案 2 :(得分:0)
最终对我有用的是将应用程序池分配给相同的身份。
一切都应该有用。
执行第1步和第2步。
最后注意,在web.config中,您可能需要在system.serviceModel部分的标记serviceHostingEnvironment中指定multipleSiteBindingsEnabled =“true”。
答案 3 :(得分:0)
尝试将您的AppPool上的身份从ApplicationPoolIdentity更改为LocalSystem。