Приложение .NET 4.0 для использования Microsoft ADO Ext. 6.0 для DDL и безопасности - PullRequest
0 голосов
/ 25 октября 2010

Я пытаюсь скомпилировать решение Xsd2Db в .NET 4.0 framework. Я добавляю ссылку на «Microsoft ADO Ext. 6.0 для DDL и безопасности» и использую ее следующим образом -

using System;
using System.IO;
using ADOX;

namespace Xsd2Db.Data
{
 /// <summary>
 /// Summary description for JetDataSchemaAdapter.
 /// </summary>
 public sealed class JetDataSchemaAdapter : AdoxDataSchemaAdapter
 {
  /// <summary>
  /// 
  /// </summary>
  internal const string Extension = ".mdb";

  /// <summary>
  /// 
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  internal static string GetPath(string name)
  {
   return Path.GetFullPath(
    Path.ChangeExtension(name, Extension));
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  internal static string GetConnectionString(string name)
  {
   return String.Format(
    "Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Jet OLEDB:Engine Type=5;",
    GetPath(name));
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="name"></param>
  protected override void DeleteCatalog(string name)
  {
   File.Delete(GetPath(name));
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="name"></param>
  protected override void CreateCatalog(string name)
  {
   // Force the run-time to let go of the file!  Otherwise,
   // cleanup and other operations might fail because the file
   // will still be in use.

            Catalog catalog = new CatalogClass();
   catalog.Create(GetConnectionString(name));
   catalog.ActiveConnection = null;
   catalog = null;
   GC.Collect();
  }

  /// <summary>
  /// 
  /// </summary>
  /// <param name="name"></param>
  /// <returns></returns>
  protected override Catalog OpenCatalog(string name)
  {
   Catalog catalog = new CatalogClass();
   catalog.let_ActiveConnection(GetConnectionString(name));
   return catalog;
  }
 }
}

Теперь у меня ошибка при компиляции: «Тип ADOX.CatalogClass не имеет конструкторов».

Нажатие на ссылку ошибки приводит меня к метаданным -

#region Assembly Interop.ADOX.dll, v4.0.30319
// C:\xsd\xsd2db\xsd2db\Common\DataSchemaAdapter\obj\Debug\Interop.ADOX.dll
#endregion

using System;
using System.Reflection;
using System.Runtime.InteropServices;

namespace ADOX {
    [Guid("00000602-0000-0010-8000-00AA006D2EA4")]
    [ClassInterface(0)]
    [TypeLibType(2)]
    public class CatalogClass : _Catalog, Catalog {
        public CatalogClass();

        [DispId(1)]
        public virtual dynamic ActiveConnection { get; set; }
        [DispId(4)]
        public virtual Groups Groups { get; }
        [DispId(2)]
        public virtual Procedures Procedures { get; }
        [DispId(0)]
        public virtual Tables Tables { get; }
        [DispId(5)]
        public virtual Users Users { get; }
        [DispId(3)]
        public virtual Views Views { get; }

        [DispId(6)]
        public virtual dynamic Create(string ConnectString);
        [DispId(7)]
        public virtual string GetObjectOwner(string ObjectName, ObjectTypeEnum ObjectType, object ObjectTypeId = Type.Missing);
        [DispId(1)]
        public virtual void let_ActiveConnection(object pVal);
        [DispId(8)]
        public virtual void SetObjectOwner(string ObjectName, ObjectTypeEnum ObjectType, string UserName, object ObjectTypeId = Type.Missing);
    }
}

Мы можем видеть public CatalogClass (); , но не конструктор.

Я верю в .NET 1.x, это сработало. Но почему .NET 4.0 имеет эту проблему? Кто-нибудь задумывался над этим и как лучше всего справиться с этим?

Спасибо!

1 Ответ

2 голосов
/ 26 октября 2010

Я выполнил поиск и обнаружил, что проблема существует в .NET 4.0. Вот некоторые объяснения и решения -

http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be-embedded-use-the-applicable-interface-instead.aspx;

http://mokosh.co.uk/post/2010/04/10/net-4-0-interop-type-cannot-be-embedded-use-the-applicable-interface-instead/

...