2012-12-14 27 views
5

Eklenti tabanlı bir sisteme benzeyen bir Masaüstü Uygulaması geliştiriyorum. Bir 'Machine' nesnesini içeren bir DLL dosyasını yükleyecek bir istemci modülüm var. Bundan sonra 'Makine' nesnesi iyi tanımlanmış arayüzlere göre manipüle edilir ve kullanılır.Nesneler arasında geçiş verileri C#

zor kısmı 'Makine' nesnesi içeren DLL başka bir programı kullanarak anında oluşturulur olmasıdır. Özünde, DLL üreten uygulama, kullanıcı girdisini kabul eder, sınıfları oluşturur, C# kod dosyalarında (önceden tanımlanmış olan, kullanıcı tarafından belirtilen alanları içeren) ve bu sınıfları bir DLL'e (makine) derler. dll dosyası).

istemci programı, dinamik bu dll alır onu yükler ve bu makine, Nesne çalışır. Ben makine nesnesinde bulunan hangi verilerin bilmiyorum esasen çünkü, Makine nesne ve istemci program arasında veri geçme sorunu çözmek için bir çözüm modelleme bir sürü sorun karşı karşıyayım

.

İstemci programı aşağıdaki şeyleri yapmaktır.

- dll yükleyin ve 'makine' nesne örneğini. - Bir arabirim aracılığıyla istemciyle bilinen 'makine' nesnesinde bir dizi işlev çağırın. - 'Makine' nesnesinden çeşitli değişkenleri ayıklayın ve kullanıcıya gösterin.

Son adımı gerçekleştiremiyorum.

Not: I alanları ile ilgili meta veri DLL üretme programı tarafından oluşturulan ve XML dosyalarında saklanan önemsiz bir çözelti programladınız. İstemci programı, makine nesnesinde depolanan alanlar hakkında bilgi almak için bu xml dosyalarını kullanır. Daha sonra, nesnenin alanlarına erişmek için makine nesnesinde yansıma kullanır.

Bunun çok hantal ve yavaş olduğunu hissediyorum. Bu tür şeyler için herhangi bir desen veya yöntem var mı? Ayrıca hafif MQ yazılımı ZeroMQ, alabilirsiniz

+0

Yönetilen Genişletilebilirlik Çerçevesine (MEF) baktınız mı? http://mef.codeplex.com/ http://msdn.microsoft.com/en-us/library/dd460648.aspx – spender

+0

Bunu duydum ve kullanımı hakkında kısa bir fikrim var. Mesele şu ki, programlamada yeniyim ve diğer dillere ve sistemlere kolayca taşınabilir bir çözüm uygulamak istiyorum. Ayrıca, bu karmaşık sistemleri gerçekten uygulamayı öğrenmek istiyorum. –

+0

C# ile uygulamak, Linux ve diğer platformlarda çalışan .Net çerçevesinin bir portu olan Mono olduğu için diğer sistemlere taşınabilir hale getirir. Bunu diğer dillere hızlı bir şekilde ulaştıracak olsa da, bu kadar jenerik olmasından endişelenmem. Her dil ve platformun kendi deyim ve en iyi uygulamaları vardır ve bir birinde iyi çalışan bir şey, başka bir işe yaramayabilir. –

cevap

3

okudum aklıma geldi bir çözüm Bu, C# Attributes için yerleşik desteği kullanmaktı. Özellik, bir özelliği, alanı, yöntemi, sınıfı, vb. Başka bir sınıf tarafından daha sonra örneğin Serialization sırasında kullanılan bazı ek meta verileriyle etiketlemenin bir yoludur. En çok orada göreceksin.

IEnumerable nesne koleksiyonunu kullanabilmem için gereken bir uygulama yaptım ve bazı verileri kullanıcı tarafından seçilen seçimlere göre bir dosyaya verdim. Bana seçenekleri yansıtma yoluyla okuma ve yönlendirme yapma yeteneği veren bir öznitelik sınıfı yarattım.Size örnek gösterelim:

Birinci nitelik sınıfı: şöyle tanımlanır Bu sınıf ile

[System.AttributeUsage(AttributeTargets.Property)] 
class ExportOptionsAttribute : System.Attribute 
{ 
    public string Header { get; set; } 
    public string FormatString { get; set; } 
    public bool Export { get; set; } 
    public int Order { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="header"></param> 
    public ExportOptionsAttribute(string header) : this (header, null, true) 
    { 

    } 

    /// <summary> 
    /// 
    /// </summary> 
    /// <param name="header"></param> 
    /// <param name="formatString"></param> 
    /// <param name="export"></param> 
    public ExportOptionsAttribute(string header, string formatString, bool export) 
    { 
     this.Header = header; 
     this.FormatString = formatString; 
     this.Export = export; 
     this.Order = 0; 
    } 
} 

, böyle benim veri sınıfı özelliklerini (kaybolmadığından olarak gerçek özellikleri bu yüzden değişti süslemeleri iş jargon):

public sealed class PartsOrder 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Customer Name", Order=0)] 
    public string CustomerName { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Catalog Name", Order = 1)] 
    public string Catalog Name { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Unit", Order = 2)] 
    public string Unit { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Component", Order = 3)] 
    public string Component { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Delivery Point", Order = 4)] 
    public string DeliveryPoint { get; set; } 

    /// <summary> 
    /// 
    /// </summary> 
    [ExportOptions("Order Date", Order = 5)] 
    public string OrderDate { get; set; } 
} 
benim ihracat rutininde Öyleyse

yerine sabit kodlama etrafında göstermek veya gizlemek için hangi alanların hakkında bilgi içeriyordu değişkendir özellik adları, ya da bir karmaşık veri yapısı geçirerek ve sipariş ne, ben sadece bu kodu yansıtma kullanarak, özellikleri döngülemek ve değerlerini çıktılamak için bu durumda bir CSV dosyasına yönlendirdim.

StringBuilder outputDoc = new StringBuilder(); 

// loop through the headers in the attributes 
// a struct which decomposes the information gleaned from the attributes 
List<OrderedProperties> orderedProperties = new List<OrderedProperties>(); 

// get the properties for my object 
PropertyInfo[] props = 
    (typeof(PartsOrder)).GetProperties(); 

// loop the properties 
foreach (PropertyInfo prop in props) 
{ 
    // check for a custom attribute 
    if (prop.GetCustomAttributesData().Count() > 0) 
    { 
     foreach (object o in prop.GetCustomAttributes(false)) 
     { 
      ExportOptionsAttribute exoa = o as ExportOptionsAttribute; 

      if (exoa != null) 
      { 
       orderedProperties.Add(new OrderedProperties() { OrderByValue = exoa.Order, PropertyName = prop.Name, Header = exoa.Header, Export = exoa.Export }); 
      } 
     } 
    } 
} 

orderedProperties = orderedProperties.Where(op => op.Export == true).OrderBy(op => op.OrderByValue).ThenBy(op => op.PropertyName).ToList(); 

foreach (var a in orderedProperties) 
{ 
    outputDoc.AppendFormat("{0},", a.Header); 
} 

// remove the trailing commma and append a new line 
outputDoc.Remove(outputDoc.Length - 1, 1); 
outputDoc.AppendFormat("\n"); 


var PartsOrderType = typeof(PartsOrder); 

//TODO: loop rows 
foreach (PartsOrder price in this.Orders) 
{ 
    foreach (OrderedProperties op in orderedProperties) 
    { 
     // invokes the property on the object without knowing the name of the property 
     outputDoc.AppendFormat("{0},", PartsOrderType.InvokeMember(op.PropertyName, BindingFlags.GetProperty, null, price, null)); 
    } 

    // remove the trailing comma and append a new line 
    outputDoc.Remove(outputDoc.Length - 1, 1); 
    outputDoc.AppendFormat("\n"); 
} 

OrderedProperties yapısı için kod buradadır:

struct OrderedProperties 
{ 
    /// <summary> 
    /// 
    /// </summary> 
    public int OrderByValue; 
    /// <summary> 
    /// 
    /// </summary> 
    public string PropertyName; 
    /// <summary> 
    /// 
    /// </summary> 
    public string Header; 
    /// <summary> 
    /// 
    /// </summary> 
    public bool Export; 
} 

Gördüğünüz gibi arsa değerlerini ayıklamak için mantık sınıfının yapısının tamamen cahil. Tek yaptığı, yarattığım öznitelikle dekore edilen özellikleri bulmak ve işlemi yürütmek için kullanmaktır.

Umarız bu her şey anlamlıdır, ve daha fazla yardıma veya açıklamaya ihtiyacınız varsa, lütfen sormaya çekinmeyin.

+0

Size gönderilen nesnenin özelliklerinin ne olduğunu bilmeden kodu üretiyorsunuz. Bu yüzden, çözümünüzü programımda kullanabilmek için kod oluşturma modülümü, bu özniteliklerini anında oluşturduğum .cs dosyalarına dahil etmek zorundayım. Bunu şimdilik uygulayacağım. Teşekkürler. Bununla birlikte, aynı şeyi daha düşük seviyede yapmak için başka yöntemler biliyor musunuz? Derleyici yapmakta olduğum şeyi yapmıyor, ama biraz daha içsel olarak mı? Ben de yansımayı kullanmaktan şüpheliyim. Ben doğru muyum –

+1

Evet, bu doğru olurdu. Ancak, takas, sonunda daha basit bir işlem kümesidir. Alanlarınız ve yöntemleriniz için öznitelikleri yığınlanabilir meta veriler olarak düşünün.Beklediğiniz öznitelikleri bildiğiniz sürece, veri maşkusunu yapabilir ve size geri gönderilen gerçek nesneler hakkında çok az şey bilerek görüntüleyebilirsiniz. [Ayrıca, niteliklerin değerleri, ihtiyacınız varsa çalışma zamanında ayarlanabilir.] (Http://stackoverflow.com/questions/51269/change-attributes-parameter-at-runtime) –

+0

Yukarıdakilerin nasıl uygulanacağını biliyor musunuz? çözüm c/C++? Ya da belki de yaptığınız şeyle alakalı belgeler? C/C++ konusunda çok ısrar ediyorum, çünkü bu dillerdeki kodlama çözümün daha çıplak kemik düzeyinde çalışmasını gerçekten kolaylaştırıyor. –

2

uygulamalar arasında iletişimi sağladı. ZeroMQ sadece 1 dll içerir ve uygulamalarınızın herhangi birine yerleştirebilirsiniz.

ZeroMQ C, C++, .NET, Python, Java, Ruby dahil, müşterinin her türlü vardır ve her ikisi de, Windows/Linux/OSX çalışabilir ..

+0

ZeroMQ web uygulamaları için daha uygun değil mi? Benim uygulama bir masaüstü uygulamasıdır. –

+3

no, uygulama için uygun, ancak web için değil, gömülüdür. –

+0

Tamam. Soket kullanmak, yansıma kullanmak gibi performans açısından yoğun olacaktır. –

İlgili konular