2014-02-07 46 views
3

母鸡我运行Visual Studio 2012中的应用程序,它就像一个魅力,但是当我尝试运行在bin文件夹中的.exe文件,我得到这个错误:Visual Studio中的Borland DLL错误

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 Program Files文件夹输出the.dll:

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

我和我的同事遇到同样的问题,请参阅http:// stackoverflow。com/questions/21628601/ado-net-2-0-interbase-driver-and-asp-net-wrong-assembly-reference,你能找出你的系统上的Borland.Data.BdxCommonDriver.DLL的PublicKeyToken是什么? – RFerwerda

+0

你能否提供更多的细节? 像,所引用的DLL文件仍然在bin文件夹中? – RvdV79

+0

Thanx对于评论家伙,我今天在学校里和我的老师一起研究过,他们的反应就像是“这到底是什么,embarcadero?” ^^引用的文件位于bin文件夹中:) – Docschnitzel

回答

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'的dbExpress配置文件的位置,以及'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#类的字段。

希望它有帮助!

UPDATE

没有安装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文件,应该可以使用这些文件。

+0

谢谢你的回答!虽然我没有RAD工作室(有点贵:D)我会在下个月的几个月考试后试试这个解决方案! :) – Docschnitzel

+0

没问题,没有RAD工作室可能很难找出差异在哪里,但最好的尝试仍然包括.ini文件。如果你想念他们,我可以告诉你这些文件的内容(它们很小)。只是放下一张纸条而已。祝你考试顺利! – RvdV79

+0

我刚刚更新了我的答案与ini文件的内容。我已经用我自己的二进制文件测试过了,它在你的二进制文件夹中包含这两个ini文件时起作用。 – RvdV79