Visual Studio Borland DLL错误

时间:2014-02-07 14:16:44

标签: database visual-studio-2012 interbase

如果我在Visual Studio 2012中运行该应用程序,它就像一个魅力,但当我尝试在bin文件夹中运行.exe文件时,我收到此错误:

System.IO.FileLoadException: Could not load file or assembly       'Borland.Data.DbxCommonDriver, Version=16.0.0.0, Culture=neutral, PublicKeyToken=a91a7c5705831a4f' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Borland.Data.DbxCommonDriver, Version=16.0.0.0, Culture=neutral, PublicKeyToken=a91a7c5705831a4f'
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
at Borland.Data.TClassRegistryPackageItem..ctor(String PackageName)
at Borland.Data.TClassRegistry.RegisterPackageClass(String ClassName, String PackageName)
at Borland.Data.Units.DBXCommon.RegisterClassLoader(TDBXProperties DriverProperties, String ClassNameProp, String ClassNameDefault, String PackageNameProp, String PackageDefault, String& ResultPackageName)
at Borland.Data.TDBXDriverRegistry.GetDriver(TDBXDriverDef DriverDef)
at Borland.Data.TDBXConnectionFactory.GetDriver(String DriverName, TDBXProperties DriverProperties)
at Borland.Data.TDBXConnectionBuilder.CreateConnection()
at Borland.Data.TDBXConnectionFactory.GetConnection(TDBXContext DBXContext, TDBXProperties ConnectionProperties)
at Borland.Data.TAdoDbxConnection.Open()
at ProjectGroep9.LoginForm.connSuccess() in c:\Users\Tom\Project2TI\trunk\ProjectGroep9\ProjectGroep9\LoginForm.cs:line 146
at ProjectGroep9.LoginForm.bevestigLabel_Click(Object sender, EventArgs e) in c:\Users\Tom\Project2TI\trunk\ProjectGroep9\ProjectGroep9\LoginForm.cs:line 58
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.Label.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

WRN: Assembly binding logging is turned OFF.
To enable assembly bind failure logging, set the registry value [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) to 1.
Note: There is some performance penalty associated with assembly bind failure logging.
To turn this feature off, remove the registry value     [HKLM\Software\Microsoft\Fusion!EnableLog].

更新:Visual Studio在抛出错误时说:     无法加载程序集Borland.Data.DbxCommonDriver,Version = 16.0.0.0,Culture = neutral,
    PublicKeyToken = a91a7c5705831a4f或其中一个依赖项。

PowerShell命令在interbaseAdo.NETDriver程序文件文件夹中为我提供了以下输出:

Borland.Data.DbxCommonDriver, Version=16.0.0.0, Culture=neutral,   
PublicKeyToken=91d62ebb5b0d1b1b

1 个答案:

答案 0 :(得分:7)

如果您安装了Embarcadero RAD Studio(我使用Delphi XE2),事实证明他们的dbExpress驱动程序比Embarcadero随其ADO.NET 2.0驱动程序提供的更新

因此,为了解决您的特定问题,您最好将Visual Studio解决方案中的app.config文件更改为:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <startup> 
       <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
   </startup>

   <system.data>
    <DbProviderFactories>      
      <remove invariant="Borland.Data.AdoDbxClient" />
      <add name="AdoDbx Data Provider" invariant="Borland.Data.AdoDbxClient"   
           description=".Net Framework Data Provider for dbExpress Drivers" 
           type="Borland.Data.TAdoDbxProviderFactory, Borland.Data.AdoDbxClient, 
           Version=16.0.0.0, Culture=neutral, PublicKeyToken=91d62ebb5b0d1b1b"/>
      <remove invariant="Borland.Data.DbxClientDriver" />
      <add name="Datasnap AdoDbx Data Provider" invariant="Borland.Data.DbxClientDriver" 
           description=".Net Framework Data Provider for Datasnap"   
           type="Borland.Data.TAdoDbxDatasnapProviderFactory, 
           Borland.Data.DbxClientDriver, Version=16.0.0.0, Culture=neutral, 
           PublicKeyToken=91d62ebb5b0d1b1b"/>      
    </DbProviderFactories>
   </system.data>  
</configuration>

这样做之后,需要执行一个小细节。您必须找到名为'dbxdrivers.ini''dbxconnections.ini'的dbExpress配置文件的位置。如果将它们放在二进制可执行文件的完全相同的位置,它将起作用。这些驱动程序指向Embarcadero的正确装配。

设置与数据库的连接也存在错误,您可以通过以下解决方法修复此错误。您可以查找所有提供的dbProviderFactories(即已安装的驱动程序),以确保正确安装了dbExpress驱动程序。它内置了以下方法(虽然快速和脏):

public InterbaseTest()
{
  if (null == this.Connection)
  {
    try
    {
       /* First list all installed and registered DbProviderFactories */
      System.Data.DataTable dt = System.Data.Common.DbProviderFactories.GetFactoryClasses();
      for (int i = 0; i < dt.Rows.Count; i++)
         Console.WriteLine("{0}: {1}", i.ToString(), dt.Rows[i][2].ToString());

       Console.WriteLine("------------------------------------------------------\n");


       this.Connection = new TAdoDbxConnection(
         string.Format("DriverName=Interbase;Database={0};", this.DatabasePath) +
         "RoleName=RoleName;User_Name=sysdba;"+
         "Password=masterkey;SQLDialect=3" +                            
         "MetaDataAssemblyLoader=Borland.Data.TDBXInterbaseMetaDataCommandFactory," +
         "Borland.Data.DbxReadOnlyMetaData,Version=11.0.5000.0,Culture=neutral," +
         "PublicKeyToken=91d62ebb5b0d1b1b;GetDriverFunc=getSQLDriverINTERBASE;" +
         "LibraryName=dbxint30.dll;VendorLib=GDS32.DLL"
       );
    }
    catch (Exception ex)
    {
      MessageBox.Show(ex.Message);
    }
  }
}

看起来很明显this.Connection是dbConnection类型,它是这个C#类中的一个字段。

希望它有所帮助!

更新

如果没有安装Embarcadero RAD Studio,可能会出现缺少.ini文件的情况。 内容非常简单,因此您可以自己创建这些文件。

'dbxconnections.ini'应该包含:

[IBConnection]
;DelegateConnection=DBXTraceConnection
DriverName=Interbase
Database=database.gdb
RoleName=RoleName
User_Name=sysdba
Password=masterkey
ServerCharSet=
SQLDialect=3
ErrorResourceFile=
LocaleCode=0000
BlobSize=-1
CommitRetain=False
WaitOnLocks=True
IsolationLevel=ReadCommitted
Trim Char=False

'dbxdrivers.ini'文件(最重要的)文件的内容应包含:

[Installed Drivers]
DBXTrace=1
DBXPool=1
Interbase=1
MySQL=1 

[DBXPool]
DelegateDriver=True
DriverName=DBXPool
DriverUnit=Data.DBXPool
DriverPackageLoader=TDBXPoolDriverLoader,DBXCommonDriver160.bpl
DriverAssemblyLoader=Borland.Data.TDBXPoolDriverLoader,Borland.Data.DbxCommonDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b

[DBXTrace]
DelegateDriver=True
DriverName=DBXTrace
DriverUnit=Data.DBXTrace
DriverPackageLoader=TDBXTraceDriverLoader,DBXCommonDriver160.bpl
DriverAssemblyLoader=Borland.Data.TDBXTraceDriverLoader,Borland.Data.DbxCommonDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b

[AutoCommit]
False=0
True=1

[BlockingMode]
False=0
True=1

[WaitOnLocks]
False=1
True=0

[CommitRetain]
False=0
True=1

[OS Authentication]
False=0
True=1

[Multiple Transaction]
False=0
True=1

[Trim Char]
False=0
True=1

[SQLDialect]
1=0
2=1
3=2


[Interbase]
DriverUnit=Data.DBXInterBase
DriverPackageLoader=TDBXDynalinkDriverLoader,DbxCommonDriver160.bpl
DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxCommonDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
MetaDataPackageLoader=TDBXInterbaseMetaDataCommandFactory,DbxInterBaseDriver160.bpl
MetaDataAssemblyLoader=Borland.Data.TDBXInterbaseMetaDataCommandFactory,Borland.Data.DbxInterBaseDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
GetDriverFunc=getSQLDriverINTERBASE
LibraryName=dbxint.dll
LibraryNameOsx=libsqlib.dylib
VendorLib=GDS32.DLL
VendorLibWin64=ibclient64.dll
VendorLibOsx=libgds.dylib
BlobSize=-1
CommitRetain=False
Database=database.gdb
ErrorResourceFile=
LocaleCode=0000
Password=masterkey
RoleName=RoleName
ServerCharSet=
SQLDialect=3
IsolationLevel=ReadCommitted
User_Name=sysdba
WaitOnLocks=True
Trim Char=False

[Interbase TransIsolation]
ReadCommited=1
RepeatableRead=2

[MYSQL]
DriverUnit=Data.DBXMySQL
DriverPackageLoader=TDBXDynalinkDriverLoader,DbxCommonDriver160.bpl
DriverAssemblyLoader=Borland.Data.TDBXDynalinkDriverLoader,Borland.Data.DbxCommonDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
MetaDataPackageLoader=TDBXMySqlMetaDataCommandFactory,DbxMySQLDriver160.bpl
MetaDataAssemblyLoader=Borland.Data.TDBXMySqlMetaDataCommandFactory,Borland.Data.DbxMySQLDriver,Version=16.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b
GetDriverFunc=getSQLDriverMYSQL
LibraryName=dbxmys.dll
LibraryNameOsx=libsqlmys.dylib
VendorLib=LIBMYSQL.dll
VendorLibWin64=libmysql.dll
VendorLibOsx=libmysqlclient.dylib
BlobSize=-1
Database=DBNAME
ErrorResourceFile=
HostName=ServerName
LocaleCode=0000
Password=password
User_Name=user
Compressed=False
Encrypted=False

如果在您的二进制文件所在的应用程序文件夹中包含这些.ini文件,则应该可以使用。