ネイティブVKを介した1Cでの.Netクラスのクロスプラットフォーム使用。 またはLinux IIでCOMを置き換える

これは記事の続きです。

» 開発→アンマネージコードからの.Netクラスのクロスプラットフォーム使用。 またはLinuxのIDispatchの類似物
» 開発→ネイティブVKを介した1Cでの.Netクラスのクロスプラットフォーム使用。 またはLinuxでCOMを置き換える

それ以来、デフォルトのパラメーターを持つメソッド、拡張メソッドの呼び出し、ジェネリックメソッドの型推論、IDynamicMetaObjectProvider(ExpandoObject、DynamicObject)を実装するオブジェクトのサポート、型メンバーへの同義語の追加、1Cでの非同期プログラミングのサポートを追加しました!

かつて、彼は1Cで.Netの記事を書きました HTTPClient、AngleSharpの例を使用します。 CSSセレクターを使用したJala承認を含むAngleSharpライブラリーを使用したサイトの便利な解析。 動的コンパイル

拡張メソッド、汎用メソッド、デフォルトパラメータの使用例がありました。 そして最終的に、IReflectを使用したコードは、C#で実際とはかけ離れていました。 新しいバージョンでは、1Cコードをできる限りオリジナルに近づけようとしました。

C#の例を分析しましょう

var config = Configuration.Default.WithDefaultLoader().WithCookies(); //     var address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes"; //      var document = BrowsingContext.New(config).OpenAsync(address).Result; //  <a href="/wiki/The_Big_Bang_Theory" title="The Big Bang Theory">The Big Bang Theory</a> var rowSelector = "a[title='The Big Bang Theory']"; var HtmlAnchorElement = document.QuerySelector<IHtmlAnchorElement>(rowSelector); rowSelector="form#searchform"; var FormElement = doc.<IHtmlFormElement>QuerySelector(rowSelector)); 

1Cのアナログは次のとおりです。

 AngleSharp=(.("AngleSharp")); Assembly=(AngleSharp.GetType()); .(Assembly.(),"","GetType"); //       AngleSharp_Configuration=(AngleSharp.("AngleSharp.Configuration")); //     GetType HtmlParser=(AngleSharp.GetType("AngleSharp.Parser.Html.HtmlParser")); //  BrowsingContext = (AngleSharp.("AngleSharp.BrowsingContext")); Configuration=(AngleSharp.("AngleSharp.Configuration")); //   ConfigurationExtensions // public static IConfiguration WithDefaultLoader(this IConfiguration configuration, Action<LoaderService> setup = null, IEnumerable<IRequester> requesters = null); // public static IConfiguration WithCookies(this IConfiguration configuration); config = (((Configuration.Default).WithDefaultLoader()).WithCookies()); address = "https://en.wikipedia.org/wiki/List_of_The_Big_Bang_Theory_episodes"; context = (BrowsingContext.New(config.())); //    //   BrowsingContextExtensions //public static Task<IDocument> OpenAsync(this IBrowsingContext context, string address); document = ((context.OpenAsync(address)).Result); rowSelector = "a[title='The Big Bang Theory']"; //   ApiExtensions //public static TElement QuerySelector<TElement>(this IParentNode parent, string selectors) where TElement : class, IElement; HtmlAnchorElement=((document.in(IHtmlAnchorElement.())).QuerySelector(rowSelector)); //  ApiExtensions //public static Task<IDocument> ApiExtensions.NavigateAsync<TElement>(this TElement element) where TElement : IUrlUtilities, IElement; //  this TElement   IElement doc=((HtmlAnchorElement.NavigateAsync()).Result); rowSelector="form#searchform"; FormElement = ((doc.in(IHtmlFormElement.())).QuerySelector(rowSelector)); ("OuterHtml="+FormElement.OuterHtml); 

いくつかの点に注意します。 建設:

 document.QuerySelector<IHtmlAnchorElement>(rowSelector); 

1Cでは次のようになります。

 HtmlAnchorElement=((document.in(IHtmlAnchorElement.())).QuerySelector(rowSelector)); 

オブジェクトとジェネリック引数が保存されるDynamicObjectの子孫を作成するにはで予約語を使用し、TryInvokeMemberを介してメソッド名とパラメーターを取得し、目的のメソッドを見つけて実行します。

これまでのところ、ジェネリックについては、デフォルトのパラメーターと配列パラメーターを持つメソッドを実装していません。

ジェネリックの場合、そのような構造のタイプが派生します。

 public K 3<K>(IList<K> param1, int param2, K param3) 

1Cの例

 List=("System.Collections.Generic.List`1[System.String]"); (.3(List.(),3,"3")); 

タイプは、Ilistにつながるリストから推測され、結果をパラメーターのタイプ3と比較します。

1C 7.xb 8.xで.NETアセンブリ使用することでしばしば批判されました。 外部コンポーネントの作成。

1.クロスプラットフォームなし
2.ロシア語の同義語はありません。

まあ、クロスプラットフォームで、彼はMSを助け、クロスプラットフォームのコンポーネントを作りました。 また、類義語をタイプに追加できるようにしました。

 AngleSharp=(.("AngleSharp")); Assembly=(AngleSharp.GetType()); .(Assembly.(),"","GetType"); //       AngleSharp_Configuration=(AngleSharp.("AngleSharp.Configuration")); //     GetType HtmlParser=(AngleSharp.GetType("AngleSharp.Parser.Html.HtmlParser")); 

同義語は拡張機能からも使用できます。 例:

 public static class  { public static string (this  ,string Str) { return .()+" "+ Str; } } 

今、あなたは呼び出すことができます:

  //         //(, "NetObjectToNative",.Native); //  = ("AddIn.NetObjectToNative.LoaderCLR"); // .(CoreClrDir,NetObjectToNative,""); //  // CoreClrDir       .Net    coreclr // NetObjectToNative      //            //  //HttpClient=(.("System.Net.Http",)); //HttpClient=(HttpClient.GetType("System.Net.Http.HttpClient")); //   .   Dll =(.("TestDllForCoreClr.")); .(.(),"GetStringFromExtensionWithParams",""); //     (.("")); //    (.GetStringFromExtensionWithParams("  GetStringFromExtensionWithParams")); 

ジェネリックメソッドの拡張機能を呼び出すこともできます。 制限に関する結論を含む。

ApiExtensions拡張メソッド:

 public static Task<IDocument> ApiExtensions.NavigateAsync<TElement>(this TElement element) where TElement : IUrlUtilities, IElement; 

IElementを制限するためにこのTElementが推測される型

 doc=((HtmlAnchorElement.NavigateAsync()).Result); 

ロードされたすべてのアセンブリを表示する方法をまだ見つけていません。 したがって、拡張機能の検索は、呼び出されたメソッドを持つ型が配置されているアセンブリで行われます。 秋に素晴らしい機能を備えたリリースが行われることを願っています。

また、インターフェイスを受信する短い記録を追加しました

代わりに

 =(.(.(),"IEnumerable")); 


として使用できます

 =(.as("IEnumerable")); =(.GetEnumerator()); //       IEnumerator =(.as("IEnumerator")); 


サンプルとソースはここからダウンロードできます。
次の記事では、 .Net Native VKによる1Cの非同期プログラミングで、1Cの非同期プログラミングについて説明します。

Source: https://habr.com/ru/post/J307188/


All Articles