Ошибка DLL Visual Studio Borland

когда я запускаю приложение в Visual Studio 2012, оно работает как шарм, но когда я пытаюсь запустить файл .exe в папке bin, я получаю эту ошибку:

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, версия = 16.0.0.0, культура = нейтральная,
PublicKeyToken = a91a7c5705831a4f или одна из ее зависимостей.

Команда PowerShell дает мне следующий вывод для .dll в папке программных файлов interbaseAdo.NETDriver:

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

person Docschnitzel    schedule 07.02.2014    source источник
comment
У меня и моего коллеги такая же проблема, см. также stackoverflow.com/questions/21628601/, не могли бы вы узнать, что такое PublicKeyToken файла Borland.Data. BdxCommonDriver.DLL в вашей системе есть?   -  person RFerwerda    schedule 07.02.2014
comment
Не могли бы вы предоставить более подробную информацию? Например, файлы DLL, на которые есть ссылки, все еще находятся в папке bin?   -  person RvdV79    schedule 07.02.2014
comment
Спасибо за комментарии, ребята, сегодня я разбирался с моими учителями в школе, и их реакция была примерно такой: какого черта, embarcadero? ^^ указанные файлы находятся в папке bin :)   -  person Docschnitzel    schedule 10.02.2014
comment
RFerwerda, возможно, вы можете попробовать это: docs.embarcadero.com/products/rad_studio/radstudio2007/ Я слишком новичок в этом (не могу даже найти токен открытого ключа)   -  person Docschnitzel    schedule 10.02.2014


Ответы (1)


Если у вас установлена ​​Embarcadero RAD Studio (например, я использую Delphi XE2), оказывается, что их драйверы dbExpress новее, чем те, которые Embarcadero поставляет со своими драйверами ADO.NET 2.0.

Поэтому, чтобы решить вашу конкретную проблему, вам лучше всего изменить файл app.config в вашем решении Visual Studio примерно так:

<?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>

После этого необходимо выполнить одну небольшую деталь. Вам нужно будет найти расположение файлов конфигурации dbExpress с именами 'dbxdrivers.ini' и 'dbxconnections.ini'. Если вы разместите их в том же месте, что и ваши двоичные исполняемые файлы, это сработает. Эти драйверы указывают на правильные сборки от 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 в папку вашего приложения, где находится ваш двоичный файл, все должно работать.

person RvdV79    schedule 27.02.2014
comment
Спасибо за ответ! У меня нет студии RAD (немного дорого :D). Я попробую это решение после экзаменов, где-нибудь в следующем месяце! :) - person Docschnitzel; 28.02.2014
comment
Нет проблем, без RAD studio было бы сложнее найти различия, но лучше всего попытаться включить файлы .ini. Если вы их пропустите, я могу рассказать вам содержимое этих файлов (они довольно маленькие). Просто напишите, чем. Удачи на экзаменах! - person RvdV79; 28.02.2014
comment
Я только что обновил свой ответ содержимым INI-файлов. Я проверил это с моим собственным двоичным файлом, и он работает, если включить эти два ini-файла в вашу двоичную папку. - person RvdV79; 28.02.2014