2013-04-04 22 views
14

C++ 'da uygulanan oldukça büyük bir sistemim var. Sistem oldukça büyük bir API'ye, C++ DLL'lerine sahip. Bu DLL'ler, güzel bir C stili API'nin aksine C++ sınıflarını dışa aktarır. ve bunları yeni bir C# projesinden kullanmam gerekiyor. - Sadece C API'leri C++ API nasıl çağırılır C#

  • COM çalışır
  • C++/CLI
  • nesneleri

    1. P/çağır: Ben .NET bildiğim kadarıyla

      yerli yazılım ile etkileşime üç yolu vardır

      Anlayabildiğim şekilde, buna göre üç yaklaşımım var:

      1. Bir sargıyı C'ye yazmak ve P/Invoke ile çağırmak. Bu çok fazla iş gibi görünüyor.
      2. COM ile bir sarıcı yazma. nasıl yapılacağını bilmiyorum, ve delirmek kolay olmadıkça bana neyin benzediğini öğrenmek istemiyorum - ölmekte olan bir teknoloji.
      3. C++/CLI'de bir sarıcı yazma. En az iş gibi görünüyor, yine de çok.

      Sorum:

      1. ben bilmek istiyorum Öncelikle neden .NET bana sadece "olduğu gibi" C++ sınıfları kullanmasına izin vermiyor? Ben bir bellek yönetimi meselesi var. ve eğer varsa, finalistleri yazmaktan daha çok, ve IDisposable'ı uyguluyorum. Bildiğim kadarıyla C++ sınıfları sadece gerçekten şık yapılardır ve P/Invoke yapıları desteklediğinden ve yapıları ilk parametre olarak alan işlevlerinden dolayı, neden sınıflarını desteklemiyorsunuz?

      2. İkincisi, gerçekten tembel olduğumu ve sıkıcı, sıkıcı, çalışacağını varsayarak, bu DLL'leri kullanmanın en iyi yolu ne olurdu? Bunları doğrudan C# olarak adlandırmak için bir olasılık en iyisi olacaktır. Değilse, sarmalayıcıları üretmek için otomatik bir aracı seviyorum. Ayrıca, DLL'ler değişebilir, muhtemelen, sadece biraz ama yine de, sarmalayıcıları elle yeniden yazmak için zorlanmaz.

      3. gerçekten iyi yanıt için

      , özellikle ilk bölümünde, veya iyi bir otomatik araç üzerinde, bir ödül ödül vereceğiz ...

      ,

    +0

    1'e eski cevaba bakınız Daha fazla bilgi için SWIG

    olduğunu. –

    +2

    http://stackoverflow.com/questions/2120690/tool-for-creating-net-wrappers-for-a-com-dll –

    +0

    C++/CLI'nin iyi olacağını düşünüyorum. Bununla birlikte, C++ ihracatı ile bunu tam olarak deneyimlemem. – chris

    cevap

    6

    Tembel bir şekilde yola çıkmak istiyorsanız C++ sınıflarınız için C# sarıcı oluşturmak üzere bir araç kullanmanızı öneririm. Ve tabii böyle bir sarmalayıcı oluşturmak için aracı farklı DLL çeşitli çağrı teamülleri vardır Çünkü similar question

    +0

    SWIG önerisi için cevabınızı kabul ediyorum. Yine de bir C Sarıcıya P/Invoke kullanarak bitirdik. –

    0

    Anladığım kadarıyla teşekkürler C++ 'da, sınıflardaki yöntemler için çağrılı çağrılar oldukça dağınıktır. Bağlayıcı tarafından kullanılan .LIB dosyaları düzeyinde, işlev adları "dekore edilmiş" olur (bkz. Ör., Name mangling). Ayrıca, bellekte sınıf değişkenlerinin düzeni C++ ile karşılaştırıldığında C++ ile karşılaştırıldığında tüm farklı uygulamalar arasında muhtemelen farklıdır, bu yüzden Interop Marshaling bu kadar büyük bir konudur. Bu yüzden benim tahminim Microsoft'un çok fazla düşük seviyeli meselenin bulunduğunu ve bu yüzden de çok değerli olduğunu ve buna değdiğini söyledi.

    C# 'yı C++' ya bağlamak için hem P/Invoke hem de COM nesnelerini kullandım, ancak C++/CLI kullanmadım. Yıllardır COM'la uğraşıyordum ve kendi dili gibi.Eğer hiç bir zaman COM yapmadıysanız, bu aşamada öğrenmeye değmeyeceğinin doğru olduğunu düşünüyorum. Bir C++/CLI, C arayüzünden her şeyi sıkıştırmak zorunda kalmadan, nesnelere arabirim oluşturmanıza izin verirse, bunun en iyi yol olacağını doğru düşünüyorsunuz.