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は、アンマネージコードを埋め込みリソースとしてコンパイルし、実行時にこれらのファイルが一時ディレクトリにない場合は、そこにコピーします。
私の場合、ファイルが実際に存在していることがわかります。それらを削除して、実行時にコピーして戻すこともできます。
なぜロードできないのか、今は困惑しています。
このマシンは、かつて.net4.5を実行していました。アンインストールされ、.net4.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);
何か考えやアイデアはありますか?