Soru .NET uygulamam için bir komut dosyası arabirimi tasarlamaya ve uygulamaya nasıl başlarım?


.NET uygulamam için bir komut dosyası arabirimi tasarlamaya ve uygulamaya nasıl başlarım?

Var VSTA (.NET eşdeğeri VBA için COM), ama anladığım kadarıyla, başvurumun her yüklemesi için bir lisans ücreti ödemek zorunda kalacağım. Bu açık bir kaynak Uygulama bu yüzden işe yaramaz.

Ayrıca, örn. tercümanların gömülmesi (IronPython?), ancak bunun bir “nesne modelini” (aşağıya bakınız) dışsal (veya dahili) betiklere göstermesine nasıl izin vereceğini anlamıyorum.

Alt sorular:

  • .NET'te komut dosyası arabirimi öyküsü nedir? Bunu .NET'te yapmak bir şekilde önemsiz midir?
  • Örneğin. Uygulamamdaki bazı .NET nesneleri ve içerdiği nesneler çalışma zamanında dışarıdan erişilebilir olarak bildirilebilir mi?
  • Nasıl olabilir dış betikler benim uygulamamıza erişir (nesne modeli aracılığıyla)?

Arka fon:

Bir zamanlar veri elde etmek ve analiz etmek için bir Macintosh uygulaması için oldukça etkili bir komut dosyası arayüzü tasarlayıp uyguladım. bir kütle spektrometresi (Mac os işletim sistemi, Sistem 7) ve daha sonra bir Windows uygulaması için bir COM arayüzü.

Her ikisi de bir “nesne modeli” ve sınıfları (özellikleri olabilir) ile tasarlandı. Bunlar aşırı sözcükler, ama Bir betikleme arayüzünde bağlam nesne modeli, esas olarak belirli sınıfların nesnelerinin bir muhafaza hiyerarşisidir. Sınıfların özellikleri, içerdiği nesnelerin listesi vardır ve sadece veri değildir, aynı zamanda fiilleri de vardır (eylemler / yöntemler). Örneğin. Macintosh durumunda tanımlanan uygulama nesnesi, cihazda kullanılan voltajlar için özelliklere sahip bir edinme nesnesini içerebilir ve fireLater fiil - dış komut dosyasından görüldüğü gibi.

Her iki durumda da, uygulamayı uygulamak için kullanılan programlama dilindeki sınıfların / nesnelerin, komut dosyası nesne modeli ile ilgisi olmadığını unutmayın. Macintosh davasında, betikleme arayüzünü uygulamak için kullanılan mekanizmalar Apple tarafından tanımlanmıştır. Apple tarafından nesne modelinin nasıl tasarlanacağı ile ilgili bazı standartlar da vardı. Örneğin, sınıflardaki belirli ortak özellikler için standart isimler.

Veya Microsoft Office uygulamalarında gösterilen COM arayüzlerinde olduğu gibi, uygulama nesnesinin belge listesine eklenmesi için kullanılabileceği gibi (bir belgenin GUI sunumunu oluşturma yan etkisiyle).

Harici komut dosyaları bir kapta yeni nesneler oluşturabilir ve herhangi bir zamanda hiyerarşinin içeriğinde gezinebilir. Macintosh'ta, örnek komut dosyaları, ör. AppleScript veya sınır.

Macintosh'ta, bir komut dosyası arabiriminin uygulanması çok karmaşıktı. Bunun için destek Metroworks'C ++ sınıf kütüphanesi (isim şu an bana kaçıyor) çok daha basitleştirdi.


32
2018-03-08 16:51


Menşei


Olası kopya stackoverflow.com/questions/137933 - Grant Peters
Ben bir kopya olduğunu sanmıyorum. Asıl soru, .NET'teki betikleme arayüz öyküsü (herhangi bir bilgiyi bulamadım) ve nesne modellerinin nasıl tasarlanacağı ve uygulanacağı (terimin komut dosyası arayüzü anlamında) hakkındadır. Gömme bir cevabın bir parçası olabilir, ama soru bu değil. "Kodlama arabirimi", "komut dosyası" kelimesinin her ikisinde de göründüğü halde "bir komut dosyası dili gömme" ile aynı değildir. - Peter Mortensen
Farkı düşündüğünüzü daha derinlemesine açıkladıysanız yardımcı olur. Programınızda, programın nesnelerini (bazı?) Manipüle edebilecek bir betik dili oluşturmaya mı çalışıyorsunuz? - Donal Fellows
İyi Google-Fu: ".NET uygulamalarının betimlenmesi". Bazı sonuçlar: .NET için komut dosyası oluşturma (Alex Angelopoulos), Uygulamanızı betimlenebilir hale getirmek için .NET'i kullanma (5 parça, doğrudan "nesne modelini" ele alır) ve .NET uygulama desteği komut dosyasını hazırlayın - pratik bir yaklaşım (Roy Osherove). - Peter Mortensen
İlgili: .NET uygulamalarına komut dosyası işlevselliği ekleme - Peter Mortensen


Cevaplar:


[DÜZENLEME: Buradaki yorumlarda da belirtildiği gibi, snippet'leri veya işlevleri barındıran iç komut dosyasını etkinleştirmeniz için önemli bir gereksiniminiz olduğunu varsayarak, birinin uygulamanızı özelleştirmesini sağlar. İnsanların uygulamanızı daha katı önceden tanımlanmış bir temelde uygulamanızdan çıkarmasına olanak tanıyan facaade]

IronRuby ve IronPython bunun için çok düzgün ve uygun (ama diğer cevapta, daha fazla altyapı tipi bir şey varsa, PowerShell uygun olabilir).

DÜZENLEME: Dahili komut dizilerini etkinleştirmek için diğer fikirler

  • Windows Workflow Foundation'ı kullanarak (bunu faaliyetlere maruz bırakmak ve / veya iş akışlarının örneklerini barındıran)
  • kullanma Spring.NET'in İfade Dili (tersine, doktora ve öğrenmesi kolay ama şaşırtıcı derecede güçlü)

2 Haziran 2011 DÜZENLEME: IronJS ayrıca uygun bir aday olabilir, onunla konuşan bir Hanselminutes var..


10
2018-03-24 13:53



Uygulamanızın dışarıdaki kullanıcıların dışarı çekmek istediği (örneğin, özel kurallar dahil olmak üzere karmaşık yollarla itme ve / veya özel kurallar dahil etmeme gibi) bir şeyleri ortaya koyduğu senaryoları desteklemeye çalışıyorsanız, bir ağ üzerinde de dahil olmak üzere bir şeyler PowerShell'e ya da her ikisini de sunmaya çalışın. NET nesneler veya cmdlet'ler [eklenti veya modüller halinde] gitmek için yoldur. Bir ağaç ağacını ortaya çıkarırsanız, bir PowerShell sağlayıcısı uygun olabilir). Şimdi, püskürtülen genelliklere sahip olarak, sorumu tam olarak okumayı bıraktım! - Ruben Bartelink
@Peter mortensen: Uygulamanızın içeriğinde üçüncü şahıslar tarafından sağlanan keyfi içerikleri çalıştırarak dahili kişiselleştirme / komut dosyalarını etkinleştirmek istiyorsanız, PS barındırma API'ları aracılığıyla PS kodu barındırabilir ve dinamik / yorumlanmış bir kod öğesi sunar. Eğer hem dahili bir harici yapıyorsanız, PS her iki durumu da ele aldığından iyi bir seçimdir. Ancak IPy / IR, dahili komut dosyası için optimize edilmiş olanıdır. Bir lang olarak PS, harici komut dosyası için en uygun olanıdır, ancak dahili olarak destekleyebilir. - Ruben Bartelink
Harici kullanıcılara gösterildiğinde: - Uygulamanızdaki statik öğeleri PS yerel / uzak istemcilerin bir karışımına sunmak için C # sınıflarını ve bazı sarıcı cmdlet'leri açığa çıkarın. Uygulamanızdaki statik öğeleri PS / C # / dinamik istemcilerin bir karışımına sunmak için C # kullanmadan cmdlet'ler kullanmanız gerekir. Uygulamanızdan SİYAH / IPy SADECE gibi dinamik istemcilere kadar olan şeyleri ifşa etmek için C # OR IPy / IR kullanabilirsiniz. - Ruben Bartelink
İnsanları, (SADECE) şeyleri özelleştirmek için .NET uygulamanıza davet ederken, ilk seçim IPy / IR ve PS çalışır. - Ruben Bartelink
PS, iç komut yazımı için en iyi seçimdir. A) Kullanıcı topluluğunuzun birçoğu zaten PS'yi anlamak için PS'yi anlamanız gerektiğinde ve dolayısıyla PS'yi anlama / anlama garantisinin olması gerekir. - Ruben Bartelink


Şuna baksana Güç kalkanı.

Scriptable olan basit Cmdlet'leri programlamanızı sağlar. Aynı zamanda hiyerarşik konteynırları da destekler (varsayılan olarak dosya sistemi, Kayıt Defteri, sertifika deposu vb.).


13
2018-03-08 17:05



Fakat başvurum için nesne modelini nerede tanımlayabilirim? Yoksa bir şekilde varlığa otomatik olarak denir mi? - Peter Mortensen
Nesne modeli bir cmdlet kümesidir. Parametreler (ve dönüş değeri) olarak .NET nesnelerini kabul edebilirler, böylece cmdlet'ten cmdlet'e 'boru' nesneleri yerleştirebilirsiniz. DOM açısından nesne modeli yoktur. - Michael Damatov
PowerShell'in çalışan bir .NET uygulamasının iç durumuna nasıl erişebileceğini anlamıyorum. Tüm .NET nesneleri, çalışan bir .NET uygulamasında varsayılan olarak dışarıya mı maruz kalıyor? Kafam karıştı. - Peter Mortensen
@Peter: Bir uygulamanın iç durumunu alma konusunda emin değilim, ancak PowerShell'den .NET sınıflarını çağırabilirsiniz. Bu sayfaya bir göz atın: msdn.microsoft.com/en-us/magazine/cc163430.aspx ... Biraz uzun-sarılmış olsa da, PowerShell ile mümkün olanı gösterir. - Robert Harvey♦
@Peter Mortensen: Uygulamanızda oluşturulacak herkese açık sınıflar var. new) daha sonra çalışan uygulamanızla konuşmanız gerekir: a) uygulamanızla aynı verileri yüklemek - uygulamanızın PS AppDomain'de çalıştıracak bir alt kümesinin bir örneğini, yani, bir Uygulamanızı, bir GUI uygulamasının komut satırı sürümünü veya b) .NET Uygulamanızı kullanarak kendi uygulamanızın AppDomain'ini alarak aldığınız şekilde, yani, bir proxy olan bir sınıfı gerçekleştirirsiniz. uygulama - bir yönetici arayüzünü bir WCF ana bilgisayarına nasıl gösterdiğinizle aynı - Ruben Bartelink


Düşünmeni öneririm Dinamik Dil Çalışma Zamanı Bir betikleme arayüzünü uygulamak için bir strateji olarak. Detaylar:

DLR şu anda destekliyor IronPython ve IronRubyartı bir dizi başka dil uygulaması bulunabilir. Codeplex. Eğer uygulamanıza özel bir dil yaratmayı düşünüyorsanız, Bitwise Magazine iyi bir astardır. makale.

Dino Viehland'ın PDC09 oturumu Scriptable Uygulamalarını Oluşturmak için Dinamik Dilleri Kullanma izlemeye değer. Demo kodunu bulabilirsiniz İşte.


7
2018-03-29 20:10



+1 Güzel bağlantı seti - Ruben Bartelink


Lua betik dili ücretsiz, çok sayıda ticari uygulamada kullanılır ve ücretsiz olarak kullanılabilen bir .NET uygulamasına kolayca gömülebilir LuaInterface gömülü yorumlayıcınızdaki komut dosyalarının kullanabileceği, uygulamanızdaki türleri ve yöntemleri göstermenize izin veren kitaplık.

Lua'nın bir C # uygulamasına nasıl yerleştirileceği hakkında bir öğretici bulunabilir İşte.

Düzenleme: Muhtemelen Lua'nın gömülü bir betik dili olacak şekilde tasarlandığına ve sonuç olarak yorumlayıcının son derece özelleştirilebilir olduğuna dikkat etmek gerekir. Ev sahibi uygulama, güvenlik modelinin bir parçası olarak yorumlama yeteneklerinin neredeyse her yönünü kısıtlayabilir; Örneğin. komut dosyalarının ağ bağlantılarını yapmasını veya dosyalara yazmasını vb. engelleme veya engelleme.

Ayrıca, sen hakkında sordun dış senaryo. Programınızı işlem dışı komut dosyaları için kullanılabilir hale getirmek, işlem dışı uygulamalarda kullanılabilir hale getirdiğiniz gibi yapılır: bir tür iletişim protokolü aracılığıyla standartlaştırılmış bir otomasyon arabirimini ortaya çıkararak. Windows'da, aynı makine çapraz işlem iletişimi için, genellikle COM olacaktır, ancak WCF, TCP remoting, RPC veya başka herhangi bir iletişim standardı da olabilir. Yapmayı seçtiğiniz şey, uygulamanızın nasıl oluşturulduğuna ve ne tür bir dış otomasyon yapacağınıza bağlıdır.


6
2018-03-31 00:18



Lua'nın oyun endüstrisinde yaygın olarak kullanıldığını ve en önemlisi de HIZLI olduğunu söylemeyi unutmuştunuz! Projem için ciddi bir sorun oldu, ancak CS-Script'in VB'yi kullanmak için kullanımına izin verdiği gerçeğinden dolayı reddedildi. Hız bir endişe olsaydı Lua'yı tercih ederdim. - David Robbins


kullandım CS-Senaryo İstediğiniz gibi bir şey yaratmak için. Benim durumumda, başvurumda bir arayüz tanımladım. Bir betik daha sonra bu arabirimi uygulamak için gerekliydi, böylece uygulamadan çalıştırılabilirdi. Uygulamam taranmış görüntüleri işlemekle ilgiliydi ve bu yüzden arayüzüm şunun gibi bir şeye benziyordu:

public interface ICustomModule
{
    void ProcessBatch(IBatch batch)
}

Bu şekilde, komutum, uygulamamda tanımladığım nesne modeline erişebildi (benim durumumda IBatch yoluyla). İyi bir şey, geliştirme sırasında komut dosyası için normal bir Sınıf Kitaplığı projesini kullanabildiğim: IntelliSense, hata ayıklama ... Kesin ayrıntıları hatırlamıyorum ama temelde uygulamasında uygulamayı kullanmaya başvurulan bir komut dosyası yerine sınıf kütüphanesi.

Ayrıca, komut dosyalarının yapılandırılmasına izin veren bir ek arayüz daha yaptım: Bir betik, bir özellik kılavuzunda uygulamam tarafından görüntülenen bir özellikler kümesi tanımlayabilir. Sanırım bu sürümü kullandım İşte Bu zamanda biraz daha esnek görünüyordu. Bu sayede kullanıcıların sadece betiği yapılandırmasına izin veremezsiniz, aynı zamanda tanımlamalar, seçimler, varsayılan değerler şeklinde de yardım edebilirsiniz ... Özellik ızgarası oldukça genişletilebilir: Bir durumda özel bir senaryo gösterecek bir senaryo vardı. Bazı karmaşık ayarları tanımlamak için form.

Düzenle: Tabii ki uygulamada "hata ayıklama" sınıf kütüphanesi için bir referans yoktu. Sadece meclisi yüklemeliyim ...


5
2018-03-28 09:38



@Stefan Egli: CS-Script çok umut verici görünüyor ve çok iyi belgelendi. Örneğin "Basitleştirilmiş Hosting Modeli", csscript.net/help/simplified_hosting.html ve csscript.net, "CS-Script, NAnt ortamında barındırılabilir. Her iki komut dosyası ve gömülü C # kodu (CDATA) NAnt derleme komut dosyalarından çalıştırabilirsiniz.". Belgeleri okuma AppleScript ve COM'un betikleme arabirimi anlamında "nesne modeli" nin bulunamayabileceğini fark ediyorum. - Peter Mortensen
"Nesne modeline" başvurduğunuzda doğru anladığımda% 100 emin değilim. Önerdiğim çözüm, Arayüzleri (veya sınıfları) betiğin uygulamanıza geri çağırmak için çağırabileceği yöntem ve özelliklerle tanımlamanıza olanak tanır. Örneğimde, kaç resmim olduğunu kontrol etmek ve yollarını öğrenmek için IBatch Referansını kullanabilirdim. Ayrıca, uygulamam tarafından işlenen bir görüntüyü silmek gibi yöntemleri de kullanabilirim (batch.DeleteImage ()). Bence istediğini yapmakta özgürsün. Ayrıca betikleri sakladığınız yerden (veritabanı olabilir) size kalmıştır ... - Stefan Egli
ayrıca belgelerin bu bölümüne bakınız: csscript.net/help/Type_sharing_patern.html - Stefan Egli
@Stefan Egli: (1/2) AppleScript ve COM ile sınıfların tanımı (betikleme arayüzünde) uygulamada kullanılan programlama dilinde sınıflardan ayrıldı. Aynı zamanda, nesnelerin / sınıfların bir gizlilik hiarşisi tanımlamak (herhangi bir betiğin yürütülmesinden önce statik anlamda) için bir yoldu. Dışarıdan bildirilen AppleScript uygulamaları için (kaynak çatalı, veri olarak - unqiue sınıflar için 4 baytlık kodlar, vb.) "Nesne modeli" - sınıf kümesi, bazıları diğer sınıfların listelerine sahip olabilirler. gizlilik hiarşi). - Peter Mortensen
Sanırım ne demek istediğini biliyorum. CS-Script ile bu tür bir ayrımınız yoktur: Arayüzler, komut dosyalarınızın neler yapabileceğini tanımlar ve arayüzlerin bir montajda tanımlanması gerekir (c # veya başka bir .net dili kullanarak). CS-Script, c # kaynak kodunu doğrudan işlemesine izin verebilmeniz için bir komut dosyası motorudur. Sahnelerin ardında c # betiği bir derleme olarak derlenir (yorumlanmaz). Bu nedenle, yazdığınız ve bir dll olarak kullandığınız herhangi bir sınıf kütüphanesi gerçekten farklı değildir (elbette bu, betiklerin çok iyi bir şekilde sonuçlanmasıyla sonuçlanır). - Stefan Egli


Ücretsiz, kolay uygulanır .AĞ komut dosyası dili, C # 'ya bir göz atın.

Görmek cevabım benzer bir soruya.

Verileri açığa çıkarmak için, bir .NET dili nasıl göründüğüne bakmanız, ilgili sınıfları halka bağlamak ve yapmak için programınızı meclislere eklemeniz gerekir.


5
2018-03-24 11:54



@Grant Peters: Nesne modeli daha sonra gerekli özellikleri ve yöntemleri ortaya çıkaran bir dizi cephe .NET sınıfından oluşabilir mi? (Muhtemelen Gof anlamında "Cephe"). - Peter Mortensen
En azından normalde nasıl kullanıldığına göre, C # 'yi bir betik dili olarak nitelendiremezdim. Bir şey için, ayrı bir derleme adımı vardır. - Donal Fellows
@Donal, bu günlerde birkaç betik dili de ayrı bir derleme adımı var (aslında, pek çok JIT derleme kullanmak, ancak sonra derlenmiş kodu önbelleğe almazsa, bunu düşünemiyorum). - Grant Peters
@Peter, c # ve .Net aracılığıyla, sınıflarınıza doğrudan erişebilirler. Bunları kamuya açık hale getirmenin yanı sıra "betik" deki işlevlere örnekler göndermenize gerek yoktur (ya da globals / statics kullanılıyorsa, betik bunlara doğrudan erişebilir). - Grant Peters
Evet, ama genelde bunu yaptıklarından gizlerler; derleme, uygulamanın sadece bir parçasıdır. (Derleyicinin, tipik HDD hızlarını geçebilecek kadar hızlı olduğu için nesne kodunu hiçbir zaman kaydetmeyen dilleri biliyorum.) - Donal Fellows


Bunun ihtiyaçlarınızı karşılayacağından emin değilim, ancak yansıma yoluyla C # kodunu derleyebilir ve çalışma zamanında çalıştırabilirsiniz (örnek kod İşte).

Böylece senaryoyu yazabilirsin. C # ve sonra "anında" derlemek ve doğrudan uygulamanızın bağlamında çalıştırın. Tabii ki güvenlik konularını akılda tutmalısınız, ancak eğer betiklere güveniyorsanız, bu sizin için işe yarayacaktır ve komut dosyalarınız için güçlü bir yönetilen dil kullanmanın yararlarından yararlanabilirsiniz.

Yüksek performansa ihtiyacınız varsa veya binlerce komut dosyası çalıştırıyorsanız, çok yavaş olabilir.


4
2018-03-24 11:46