Important Dotnet Q&a

  • November 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Important Dotnet Q&a as PDF for free.

More details

  • Words: 5,223
  • Pages: 11
Basic .NET Framework questions 1) What is IL? (What is MSIL or CIL, What is JIT?) MSIL is the CPU –independent instruction set into which .Net framework programs are compiled. It contains instructions for loading, storing initializing, and calling methods on objects. 2) What is the CLR? Common Language Runtime is the execution engine for .NET Framework applications. It provides a number of services, including the following. Code management (loading and execution), Application memory isolation, Verification of type safety, Conversion of IL to native code , Access to metadata (enhanced type information), Managing memory for managed objects, Enforcement of code access security, Exception handling, including cross-language exceptions, Interoperation between managed code, COM objects, and pre-existing DLLs (unmanaged code and data), Automation of object layout, Support for developer services (profiling, debugging, and so on) 3) What is the CTS? The common type system is a rich type system, built into the common language runtime, that supports the types and operations found in most programming languages. The common type system supports the complete implementation of a wide range of programming languages. 4) What is CLS (Common Language Specification)? The Common Language Specification is a set of constructs and constraints that serves as a guide for library writers and compiler writers. It allows libraries to be fully usable from any language supporting the CLS, and for those languages to integrate with each other. The Common Language Specification is a subset of the common type system. The Common Language Specification is also important to application developers who are writing code that will be used by other developers. When developers design publicly accessible APIs following the rules of the CLS, those APIs are easily used from all other programming languages that target the common language runtime. 5) What is Managed Code? Managed code is code that is written to target the services of the common language runtime (see What is the Common Language Runtime?). In order to target these services, the code must provide a minimum level of information (metadata) to the runtime. Managed data—data that is allocated and deallocated by the common language runtime's garbage collector. 6) What is Assembly? Assemblies are the building blocks of .NET Framework applications; they form the fundamental unit of deployment, version control, reuse, activation scoping, and security permissions. An assembly is a collection of types and resources that are built to work together and form a logical unit of functionality. An assembly provides the common language runtime with the information it needs to be aware of type implementations. To the runtime, a type does not exist outside the context of an assembly. 7) What are different types of Assemblies? Single file and multi file assembly. Assemblies can be static or dynamic. Private assemblies and shared assemblies

1

8) What is Namespace? A namespace is a logical naming scheme for types in which a simple type name a 9) What is Difference between Namespace and Assembly? Namespace is a logical design-time naming convenience, whereas an assembly establishes the name scope for types at run time. 10) If you want to view a Assembly how to you go about it (: What is ILDASM ?)? You can use the MSIL Disassembler (Ildasm.exe) to view Microsoft intermediate language (MSIL) information in a file. If the file being examined is an assembly, this information can include the assembly's attributes, as well as references to other modules and assemblies. This information can be helpful in determining whether a file is an assembly or part of an assembly, and whether the file has references to other modules or assemblies. To view assembly contents At the command prompt, type the following command: Ildasm In this command, assembly name is the name of the assembly to examine. 11) What is Manifest? Every assembly, whether static or dynamic, contains a collection of data that describes how the elements in the assembly relate to each other. The assembly manifest contains this assembly metadata. An assembly manifest contains all the metadata needed to specify the assembly's version requirements and security identity, and all metadata needed to define the scope of the assembly and resolve references to resources and classes. The assembly manifest can be stored in either a PE file (an .exe or .dll) with Microsoft intermediate language (MSIL) code or in a standalone PE file that contains only assembly manifest information. 12) Where is version information stored of an assembly? The version number is stored in the assembly manifest along with other identity information, including the assembly name and public key, as well as information on relationships and identities of other assemblies connected with the application. 13) Is versioning applicable to private assemblies? 14) What is GAC (What are situations when you register .NET assembly in GAC?)? Each computer where the common language runtime is installed has a machine-wide code cache called the global assembly cache. The global assembly cache stores assemblies specifically designated to be shared by several applications on the computer. There are several ways to deploy an assembly into the global assembly cache: 1)Use an installer designed to work with the global assembly cache. This is the preferred option for installing assemblies into the global assembly cache. 2)Use a developer tool called the Global Assembly Cache tool (Gacutil.exe) provided by the .NET Framework SDK. 3) Use Windows Explorer to drag assemblies into the cache. 15) What is concept of strong names (How do we generate strong names or what is the process of generating strong names, What is use of SN.EXE, How do we apply strong names to assembly? How do you sign an assembly?)? A strong name consists of the assembly's identity — its simple text name, version number, and culture

2

information (if provided) — plus a public key and a digital signature. It is generated from an assembly file using the corresponding private key. (The assembly file contains the assembly manifest, which contains the names and hashes of all the files that make up the assembly.) There are two ways to sign an assembly with a strong name: 1) Using the Assembly Linker (Al.exe) provided by the .NET Framework SDK. 2) Using assembly attributes to insert the strong name information in your code. You can use either the AssemblyKeyFileAttribute or the AssemblyKeyNameAttribute, depending on where the key file to be used is located.

16) How to add and remove an assembly from GAC? The gacutil.exe that ships with .NET can be used to add or remove a shared assembly from the GAC. To add a shared assembly, from the command line enter: gacutil.exe /i myassembly.dll To remove from shared assembly: gacutil.exe /u myassembly.dll 17) What is Delay signing? Delay signing allows a developer to add the public key token to an assembly, without having access to the private key token. 18) What is garbage collector? The garbage collector's job is to identify objects that are no longer in use and reclaim the memory. What does it mean for an object to be in use? 19) Can we force garbage collector to run? Garbage collector works automatically and you cannot force the garbage collector to run. 20) What is reflection? Reflection is the mechanism of discovering class information solely at run time 21) What are Value types and Reference types? Reference types are stored on the run-time heap; they may only be accessed through a reference to that storage. Because reference types are always accessed through references, their lifetime is managed by the .NET Framework Value types are stored directly on the stack, either within an array or within another type; their storage can only be accessed directly. Because value types are stored directly within variables, their lifetime is determined by the lifetime of the variable that contains them 22) What is concept of Boxing and Unboxing? Boxing and unboxing is a essential concept in. NET’s type system. With Boxing and unboxing one can link between value-types and reference-types by allowing any value of a value-type to be converted to and from type object. Boxing and unboxing enables a unified view of the type system wherein a value of any type can ultimately be treated as an object. Converting a value type to reference type is called Boxing. Unboxing is the opposite operation and is an explicit operation. 23) What’s difference between VB.NET and C#?

3

Although differences exist between Visual Basic .NET and Visual C# .NET, they are both first-class programming languages that are based on the Microsoft® .NET Framework, and they are equally powerful..." 24) What is CODE Access security? Code access security is a mechanism that helps limit the access code has to protected resources and operations. In the .NET Framework *Primitive : Data types that can be mapped directly to the .NET Framework Class Library (FCL) types are called Primitive. For example, the type "int" is mapped to System.Int32, "short" is mapped to System.Int16, and so on. In fact, all data types in .NET are derived from the System.Object class. The following two classes are equivalent (in C#): // Class implicitly derives from System.Object Class Car{};Class Car{};// Class explicitly derives from System.Object Class Car: System.Object{}; NET Interoperability 1) How can we use COM Components in .NET (What is RCW)? Whenever managed client calls a method on a COM object, the runtime creates a runtime callable wrapper (RCW). NET components can call COM components. COM components can call .NET components. One tool for performing this conversion is called tlbimp (type library importer), and it is provided as part of the .NET Framework Software Developer Kit (SDK). Tlbimp reads the metadata from a COM type library and creates a matching CLR assembly for calling the COM component. For example, to convert a Visual Basic ActiveX DLL named support.dll to a matching .NET assembly with the name NETsupport.dll, you could use this command line: tlbimp support.dll/out: NETsupport.dll 2) Once I have developed the COM wrapper do I have to still register the COM in registry? 3) How can we use .NET components in COM (What is CCW) (COM callable wrapper)? What caution needs to be taken in order that .NET components are compatible with COM? When a COM client calls a .NET object, the common language runtime creates the managed object and a COM callable wrapper (CCW) for the object. Unable to reference a .NET object directly, COM clients use the CCW as a proxy for the managed object. 4) How can we make Windows API calls in .NET? Windows APIs are dynamic link libraries (DLLs) that are part of the Windows operating system. You use them to perform tasks when it is difficult to write equivalent procedures of your own. For example, Windows provides a function named FlashWindowEx that lets you make the title bar for an application alternate between light and dark shades. The advantage of using Windows APIs in your code is that they can save development time because they contain dozens of useful functions that are already written and waiting to be used. The disadvantage is that Windows APIs can be difficult to work with and unforgiving when things go wrong. 5) When we use windows API in .NET is it managed or unmanaged code? 6) What is COM? COM is a platform-independent; object-oriented system for creating binary software components that can interact with other COM-based components in the same process space or in other processes on remote machines. COM is the foundation technology for many other Microsoft technologies, such as

4

Active Server Pages (ASP), Automation, ISAPI, and ActiveSync. 7) What is Reference counting in COM? The methods in the audio interfaces follow a general set of rules for counting references on the COM objects that they take as input parameters or return as output parameters. 8) Can you describe IUnknown interface in short? The components IUnknown interface helps to maintain a reference count of the number of clients using the component. When this count drops down to zero, the component is unloaded. All components should implement the IUnknown interface. The reference count is maintained through IUnknown:: AddRef() & IUnknown::Release() methods, interface discovery is handled through IUnknown::QueryInterface(). 9)Can you explain what is DCOM? Microsoft® Distributed COM (DCOM) extends the Component Object Model (COM) to support communication among objects on different computers—on a LAN, a WAN, or even the Internet. With DCOM, your application can be distributed at locations that make the most sense to your customer and to the application. 10) DTC in .NET? The DTC is a system service that is tightly integrated with COM+. To help make distributed transactions work more seamlessly, COM+ directs the DTC on behalf of an application. This makes it possible to scale transactions from one to many computers without adding special code. The DTC proxy DLL (Msdtcprx.dll) implements the DTC interfaces. Applications call DTC interfaces to initiate, commit, abort, and inquire about transactions 10) How many types of Transactions are there in COM + .NET? 11) How do you do object pooling in .NET? 12) What are types of compatibility in VB6?

ASP.NET 1) What’s the sequence in which ASP.NET events are processed? a) Initialize: Initialize settings needed during the lifetime of the incoming Web request. b) Load view state: At the end of this phase, the ViewState property of a control is automatically populated c) Process postback data: Process incoming form data and update properties accordingly. d) Load: Perform actions common to all requests, such as setting up a database query. At this point, server controls in the tree are created and initialized, the state is restored, and form controls reflect client-side data. e) Send postback change notifications: Raise change events in response to state changes between the current and previous postbacks. f) Handle postback events: Handle the client-side event that caused the postback and raise appropriate events on the server. g) Prerender: Perform any updates before the output is rendered. Any changes made to the state of the control in the prerender phase can be saved, while changes made in the rendering phase are lost.

5

h) Save state: The ViewState property of a control is automatically persisted to a string object after this stage. This string object is sent to the client and back as a hidden variable. For improving efficiency, a control can override the SaveViewState method to modify the ViewState property. i) Render: Generate output to be rendered to the client. j) Dispose: Perform any final cleanup before the control is torn down. References to expensive resources such as database connections must be released in this phase. k) Unload: Perform any final cleanup before the control is torn down. Control authors generally perform cleanup in Dispose and do not handle this event. Initialization, Page Load, PreRendor, Page unload 2) In which event are the controls fully loaded? 3) How can we identify that the Page is PostBack? Readonly Property IsPostback as Boolean

VB: Public C#: Public bool IsPostBack {get;}

4) How does ASP.NET maintain state in between subsequent request? When a form is submitted in ASP .NET, the form reappears in the browser window together with all form values. This is because ASP .NET maintains ViewState. The ViewState indicates the status of the page when submitted to the server. The status is defined through a hidden field placed on each page with a
control. The source could look something like this:
Maintaining the ViewState is the default setting for ASP.NET Web Forms. If you want to NOT maintain the ViewState, include the directive <%@ Page EnableViewState="false" %> at the top of an. aspx page or add the attribute EnableViewState="false" to any control. 5) What is event bubbling? The ASP.NET page framework provides a technique called event bubbling that allows a child control to propagate events up its containment hierarchy. Event bubbling enables events to be raised from a more convenient location in the controls hierarchy and allows event handlers to be attached to the original control as well as to the control that exposes the bubbled event. 6) How do we assign page specific attributes? Defines page-specific (.aspx file) attributes used by the ASP.NET page parser and compiler. Example: <%@ Page attribute="value" [attribute="value"...] %> 7) Administrator wants to make a security check that no one has tampered with ViewState, how can we ensure this? Microsoft has provided two mechanisms for increasing the security of ViewState. a) Machine Authentication Check (MAC) - tamper-proofing <%@ Page EnableViewStateMac="true"%> b) Encrypting the ViewState This encryption can only be applied at the machine.config level, as follows: <machineKey validation='3Des' /> 8) @ Register directives? Associates aliases with namespaces and class names for concise notation in custom server control syntax. <%@ Register tagprefix="tagprefix" Namespace="namespace" Assembly="assembly %> <%@ Register tagprefix="tagprefix" Tagname="tagname" Src="pathname" %>

6

9) What’s the use of SmartNavigation property? Gets or sets a value indicating whether smart navigation is enabled. VB: Public Property SmartNavigation As Boolean C#: Public bool SmartNavigation {get; set;} 10) What is AppSetting Section in “Web.Config” file? The element of a web.config file is a place to store connection strings, server names, file paths, and other miscellaneous settings needed by an application to perform work. The items inside appSettings are items that need to be configurable depending upon the environment; for instance, any database connection strings will change as you move your application from a testing and staging server into production. 11) Where is ViewState information stored? The ViewState is stored in the page as a hidden form field. When the page is posted, one of the first tasks performed by page processing is to restore the view state. 12) What’s the use of @ OutputCache directive in ASP.NET? The output cache respects the expiration and validation policies for pages <%@ OutputCache Duration="60" VaryByParam="none"%> Output caching is a powerful technique that increases request/response throughput by caching the content generated from dynamic pages. Output caching is enabled by default, but output from any given response is not cached unless explicit action is taken to make the response cacheable. 13) How can we create custom controls in ASP.NET? To create a simple custom control, define a class that derives from System.Web.UI.Control and override its Render method. The Render method takes one argument of type System.Web.UI.HtmlTextWriter. The HTML that your control wants to send to the client is passed as a string argument to the Write method of HtmlTextWriter. 14) How many types of validation controls are provided by ASP.NET? A Validation server control is used to validate the data of an input control. If the data does not pass validation, it will display an error message to the user. The syntax: RequiredFieldValidator: Checks that the user enters a value that falls between two values RegularExpressionValidator: Ensures that the value of an input control matches a specified pattern RequiredFieldValidator CustomValidator: Allows you to write a method to handle the validation of the value entered RangeValidator: Checks that the user enters a value that falls between two values CompareValidator: Compares the value of one input control to the value of another input control or to a fixed value ValidationSummary: Displays a report of all validation errors occurred in a Web page 15) Can you explain what is “AutoPostBack” feature in ASP.NET? AutoPostBack automatically posted whenever the form containing textbox control Text Changed. 16) Paging in DataGrid? The ASP.NET DataGrid control provides a built-in engine for paging through bound data. The engine supports two working modes—automatic and manual. Automatic paging means that you bind the whole data source to the control and let it go. The control displays a proper navigation bar and handles

7

users clicking on the movement buttons. Automatic paging doesn’t require a deep understanding of the grid’s internals, nor does it take you much time to arrange an effective solution. For large data sets, though, it might not be a smart option. Handcrafted, custom paging is the alternative. Custom paging means that the host page is responsible for filling the grid control with up-to-date information. When the grid’s current page index is, say, “3” the page must provide the set of records that fit in page number 3. 17) What’s the use of “GLOBAL.ASAX” file? The Global.asax file, called the ASP.NET application file, provides a way to respond to application or module level events in one central location. You can use this file to implement application security, as well as other tasks. Every ASP.Net application can contain single Global.asax in its root directory. Can be use to handle application wide events and declare application wide objects.

18) What’s the difference between “Web.config” and “Machine.Config”? Web.config is a security in ASP.Net application and how to secure applications. Web.config does most of the work for the application the who, what, where, when and how to be authenticated Machine.config contains settings that apply to an entire computer. This file is located in the %runtime install path%\Config directory. Machine.config contains configuration settings for machine-wide assembly binding, built-in remoting channels 19) What’s a SESSION and APPLICATION object? 20) What’s difference between Server.Transfer and Response.Redirect? Response.Redirect simply sends a message down to the browser, telling it to move to another page. So, you may run code like: Response.Redirect ("WebForm2.aspx") Server.Transfer is similar in that it sends the user to another page with a statement such as Server.Transfer, "transfer" process can work on only those sites running on the server, you can't use Server.Transfer to send the user to an external site. Only Response.Redirect can do that. Transferring to another page using Server.Transfer conserves server resources. Instead of telling the browser to redirect, it simply changes the "focus" on the Web server and transfers the request. This means you don't get quite as many HTTP requests coming through, which therefore eases the pressure on your Web server and makes your applications run faster. 21) What’s difference between Authentication and authorization? Authentication and Authorization are two interrelated security concepts. In short, authentication is a process of identifying a user, while authorization is the process of determining if an authenticated user has access to the resource(s) they requested. 22) What is impersonation in ASP.NET? Impersonation is when ASP.NET executes code in the context of an authenticated and authorized client. By default, ASP.NET does not use impersonation and instead executes all code using the same user account as the ASP.NET process, which is typically the ASPNET account. 24) What are the various ways of authentication techniques in ASP.NET? ASP.NET provides built-in support for user authentication through several authentication providers: Forms-based authentication: the application is secured by using a

8

custom authentication model with cookie support. Passport authentication: the application is secured by using Microsoft® Passport authentication. Passport is a single sign-on technology developed by Microsoft for use on the web. Windows authentication: the application is secured by using integrated windows authentication where access to a web application is allowed only to those users who are able to verify their windows credentials.

25) What’s difference between Datagrid, Datalist and Repeater? From performance point of view how do they rate? The DataGrid Web control provides the greatest feature set of the three data Web controls, with its ability to allow the end-user to sort, page, and edit its data. The DataGrid is also the simplest data Web control to get started with, as using it requires nothing more than adding a DataGrid to the Web page and writing a few lines of code. The ease of use and impressive features comes at a cost, though, namely that of performance: the DataGrid is the least efficient of the three data Web controls, especially when placed within a Web form. With its templates, the DataList provides more control over the look and feel of the displayed data than the DataGrid. Using templates, however, typically requires more development time than using the DataGrid's column types. The DataList also supports inline editing of data, but requires a bit more work to implement than the DataGrid. Unfortunately, providing paging and sorting support in the DataList is not a trivial exercise. Making up for these lacking built-in features, the DataList offers better performance over the DataGrid. Finally, the Repeater control allows for complete and total control of the rendered HTML markup. With the Repeater, the only HTML emitted are the values of the databinding statements in the templates along with the HTML markup specified in the templates—no "extra" HTML is emitted, as with the DataGrid and DataList. By requiring the developer to specify the complete generated HTML markup, the Repeater often requires the longest development time. Furthermore, the Repeater does not offer built-in editing, sorting, or paging support. However, the Repeater does boast the best performance of the three data Web controls. Its performance is comparable to the DataList's, but noticeably better than the DataGrid's. 26) What’s the method to customize columns in DataGrid? You can control the order, behavior, and rendering of individual columns by directly manipulating the grid's Columns collection. The standard column type -- BoundColumn -- renders the values in text labels. The grid also supports other column types that render differently. Any of the column types can be used together with the Columns collection of a DataGrid. Note that you can use explicitly-declared columns together with auto-generated columns (AutoGenerateColumns=true). When used together, the explicitly-declared columns in the Columns collection are rendered first, and then the auto-generated columns are rendered. The auto-generated columns are not added to the Columns collection. Column Name Description BoundColumn Lets you control the order and rendering of the columns. HyperLinkColumn Presents the bound data in HyperLink controls. ButtonColumn Bubbles a user command from within a row to an event handler on the grid. TemplateColumn Lets you control which controls are rendered in the column. EditCommandColumn Displays Edit, Update, and Cancel links in response to changes in the DataGrid control's EditItemIndex property. 27) How can we format data inside DataGrid? You can format items in the DataGrid Web server control to customize their appearance. You can Set the color, font, borders, and spacing for the grid as a whole. Set the color, font, and alignment for each type of grid item (row) individually, such as item, alternating item, selected item, header, and footer. Changing these settings allows you to override the settings you make for the entire grid. Set the color,

9

font, and alignment for individual columns. This is particularly useful for setting the appearance of a special-purpose column such as a button column. To set the format for an individual item 1. In Design view, select the DataGrid control, then click the Property Builder link at the bottom of the Properties window. 2. In the DataGrid Properties dialog box, click the Format tab, and under Objects do one of the following: Select Header, Footer, or Pager. -or- Expand the Items node and select the type of item to format. 3. Choose font, color, and alignment options for that item, and then choose Apply. 28) How will decide the design consideration to take a Datagrid, datalist or repeater? 29) Difference between ASP and ASP.NET? 30) What are major events in GLOBAL.ASAX file? What order they are triggered? The global.asax file can be found in the root directory of an ASP.Net application. Here is the list of events you can call. By calling them you are actually overriding the event that is exposed by the HttpApplication base class. Application_Start : used to set up an application environment and only called when the application first starts. Application_Init : This method occurs after _start and is used for initializing code. Application_Disposed : This method is invoked before destroying an instance of an application. Application_Error : This event is used to handle all unhandled exceptions in the application. Application_End : used to clean up variables and memory when an application ends. Application_BeginRequest : This event is used when a client makes a request to any page in the application. It can be useful for redirecting or validating a page request. Application_EndRequest : After a request for a page has been made, this is the last event that is called. Application_PreRequestHandlerExecute : This event occurs just before ASP.Net begins executing a handler such as a page or a web service. At this point, the session state is available. Application_PostRequestHandlerExecute : This event occurs when the ASP.Net handler finishes execution. Application_PreSendRequestHeaders : This event occurs just before ASP.Net sends HTTP Headers to the client. This can be useful if you want to modify a header Application_PreSendRequestContent : This event occurs just before ASP.Net sends content to the client. Application_AcquireRequestState : This event occurs when ASP.Net acquires the current state (eg: Session state) associated with the current request. Application_ReleaseRequestState : This event occurs after ASP.NET finishes executing all request handlers and causes state modules to save the current state data. Application_AuthenticateRequest : This event occurs when the identity of the current user has been established as valid by the security module. Application_AuthorizeRequest : This event occurs when the user has been authorized to access the resources of the security module. Session_Start : this event is triggered when any new user accesses the web site. Session_End : this event is triggered when a user's session times out or ends. Note this can be 20 mins (the default session timeout value) after the user actually leaves the site.

10

What is the difference between HTTPMODULES and HTTPHANDLERS? HTTP handlers are the end point objects in ASP.NET pipeline and an HTTP Handler essentially processes the request and produces the response. For example an ASP.NET Page is an HTTP Handler. HTTP Modules are objects which also participate the pipeline but they work before and after the HTTP Handler does its job, and produce additional services within the pipeline (for example associating session within a request before HTTP handler executes, and saving the session state after HTTP handler has done its job, is basically done by an HTTP module, SessionStateModule)

Delegates and Event Handling in C#

Introduction: This article will deal with Event and delegates in C#. C# Open a new door by including the feature of Event Driven programming such as Events and Delegates. This article is part of the series that helps in understanding Events and Delegates. Events are the means by which Windows Application receive notification. In a Windows application a lot of Events are occurring at a particular instant for e.g. Mouse Move, Mouse out, Mouse Click etc. Delegates are pointer to the function and are type-safe. This Article will cover the Single delegate, Multicast delegates and Event Driven programming using C#. The first part of this article will focus delegates and its types and the remaining part is on Events. Delegates: Another very interesting feature in C# is delegates. Delegates are best complemented as new type of Object in C#. They are also represented as pointer to functions. Technically delegate is a reference type used to encapsulate a method with a specific signature and return type. Since in this article delegate discussion is event centric. If we consider a real world scenario then delegates can be understood as any delegate representing a country a group of people representing a company etc. This same definition can be mapped to C# as delegate act as an intermediary between event source and destination. The DotNetFrameWork has a Name Space System.Delagate. We have two flavors of delegate in C#. · Single Delegate · Multi-cast Delegate

11

Related Documents

Dotnet Qa
November 2019 25
Important Dotnet Q&a
November 2019 1
Dotnet
November 2019 30
Dotnet
November 2019 23
Dotnet
November 2019 31
Dotnet
October 2019 29