Magnus Mårtensson
Microsoft Regional Director, Azure MVP, CEO Loftysoft
Avirag Jain
Director & CTO R Systems
Mahesh Chand
Founder C# Corner, CEO Mindcracker
Chris Gali
CEO & Co-Founder Graphite
Subinder Khurana
Chief Architect StoryProcess, Founder NASSCOM DeepTech Club
Bryan Rishforth
Investor, Chairman Graphite
Bryn Everson
Director Biz Dev Graphite
Raj Tiwari
Digital Transformation Leader, Futurist and Visionary
Joseph Guadagno
Microsoft MVP, Lead Quicken Loans
Nikita Sachdev
Entrepreneur, Blockchain Enthusiast & Advisor, Social Media Influencer
Doug Wagner
COO & Founder Adapt Technical Group
Ritesh Modi
Architect, Senior Evangelist, Cloud Architect
Crystal Wenrick
Director Communications Mindcracker
Allen O’Neill
Microsoft MVP, Consulting Engineer/Architect
Praveen Kumar
CEO MCN Solutions
Chris Love
Founder Love2Dev, Microsoft MVP, Author
Sanjay Vyas
Microsoft Regional Director, Microsoft MVP, Founder & CEO SkillLabs Technologies
Veena Sarda
Deep Learning Consultant, Author
Sekhar Srinivasan
C# Corner MVP, Microsoft Certified Trainer, Pluralsight Author
Lalit Bansal
Founder & CEO - EIY SYS
Navdeep Garg
CEO Revinfotech
Prakash Tripathi
Tech Manager/Leader, Microsoft MVP, Blogger
Bhavna Jain
Breakthrough Consultant
Naveen Sharma
Enterprise Architect, Leadership Coach, Author
Vidya Vrat Agarwal
Principal Architect, Microsoft MVP, Author
Sheetal Agarwal
Founder Clownselors, Medical Clown, Trainer
Abhishek Kant
Founder GTM Catalyst
Vishnu Saran
Founder & CEO VoiceQube
Sandeep Soni
Founder & CEO Deccansoft, Microsoft Certified Trainer
Parveen Malik
AVP InfoSec & Vulnerability Management, Information Security Expert
Nitin Pandit
Microsoft MVP, Developer Evangelist, Author
Niloshima Srivastava
C# Corner MVP, Tech Architect, Trainer, Blogger
Bala Chirtsabesan
Senior Software Engineer at Microsoft, Author
Manoj Mittal
Sr. Technical Architect, C# Corner MVP, Author
Chandni Di
Co-Founder Voice of Slum
Vithal Wadje
Technical Lead, Microsoft MVP, Author
Shivam Ahuja
Founder SkillCircle, Business Mentor
Chervine Bhiwoo
Solution Architect, Microsoft MVP, Author
Saurabh Jain
Vice President Paytm, Founder Fun2Do Labs, Author
Vinay Solanki
Head IoT at Lenovo, Founder IoT-NCR
Anshu kumari
Founder Blockchainkids, Inventor, Trainer
Amit Singal
CEO Startup Buddy
Dev Pratap
Co-Founder & CEO Voice of Slum
Amey Vartak
Technology Consultant, Full Stack Developer, C# Corner MVP, Author
Viswanatha Swamy
Principal Software Engineer, C# Corner MVP, Author
Sanket Verma
Research Engineer @ Ballistics (Forensics) and Chair, PyData Delhi
Sourabh Somani
Lead Developer, Microsoft MVP, Author
Abhishek Mishra
Software Architect, C# Corner MVP, Author
Siddharth Vaghasia
Technical Consultant, C# Corner MVP, Blogger
Bassam Alugili
Senior Software Specialist, Database Expert
S Ravi Kumar
Solution Architect, C# Corner MVP, Author
Sundaram Subramanian
Full Stack Developer, C# Corner MVP, Speaker
Deepesh Somani
Solution Architect, Microsoft MVP, Author
Debasis Saha
Technical Project Manager, C# Corner MVP, Blogger, Author
Vipul Jain
Software Architect, C# Corner MVP, Author
Akshay Patel
Technical Architect, Microsoft Certified Trainer, C# Corner MVP, Author
Stephen Simon
RPA Developer, Evangelist, Author
Vivek Sharma
Founder Kingster636, AR/VR Specialist
Jeetendra Gund
Technical Lead, C# Corner MVP, Author
Sujal Beniwal
AI Enthusiast, Student
M Viknaraj
Microsoft MVP, Azure Architect, Author
Prasham Sabadra
Software Architect, C# Corner MVP, Trainer, Author
Aakash Maurya
Senior Developer, C# Corner MVP, Speaker
Ankit Sharma
Senior Software Engineer, C# Corner MVP, Author
Mangesh Gaherwar
Team Lead, C# Corner MVP, Author
Viral Jain
Technical Consultant, C# Corner MVP, Author
Bhasker Das
Solution Architect, Evangelist
Manish Dwivedi
Associate Project Manager
Ck Nitin
Programmer, Author
Rohit Gupta
Technical Trainer, Author
Manish Tewatia
Full-stack Marketer, UX Designer
Bhavya Gaur
Technical Illustrator
Rohit Tomar
SEO/SMO Expert
Web Track
Cloud & Data Track
Dev Track
Registration & Breakfast
Future of Desktop Apps with JS (ElectronJs)
Nitin Pandit
Building Serverless Microservices Using Microsoft Azure
Vithal Wadje
Innovating RPA: A Robot for Every Person
Stephen Simon
Managing Cloud Storage Accounts using Logic Apps
Viknaraj Manogararajah
Data visualization using Python
Sekhar Srinivasan
Going Cross platform with AR Foundation
Vivek Sharma
Keynote
Managing your Azure dependencies in ASP.NET Core apps using VS
Bala Chirtsabesan
Securing Applications on Intelligent Azure
Abhishek Mishra
Getting started with Blazor the Framework of Future
S Ravi Kumar
Lunch
Build Progressive Web Apps using Angular 9
Debasis Saha
Build and deploy to any platform using Azure DevOps
Chervine Bhiwoo
Deep Dive in Azure Service Bus
Akshay Patel
Build a Native Mobile Application using React Native and JavaScript
Joseph Guadagno
Making sense of Web Job, Web Job SDK and Functions in Azure
Prakash Tripathi
CloudFront Distribution in AWS
Viral Jain
Tea Break
Introduction to PowerBI
Aakash Maurya
Build Advanced SPFx solutions with React and Graph API
Siddharth Vaghasia
Build Business Intelligence Analyst (BIA) Skills
Sundaram Subramanian
Deep dive of Power Platform – AI BUILDER
Prasham Sabadra
Panel 1
What's new in SharePoint development
Vipul Jain
Build a SSO (Single Sign On) based Native JavaScript application with Microsoft Identity within 10 minutes
Manoj Mittal
Panel 2
Applications and working of AI
Veena Sarda
Deploying serverless API's with .Net core 3.0 on AWS & Azure
Amey Vartak
Panel 3
Blockchain with .NET Core (Ark)
Anshu Kumari
Closing Note & Prize Distribution
Dev Track
Cloud Track
Architecture Track
Emerging Tech Track
Registration & Breakfast
Creating Full-Stack Web Apps Using Server-Side Blazor
Ankit Sharma
Real time face recognition with MS Cognitive Services
Niloshima Srivastava
Building Scalable APIs with GraphQL
Jeetendra Gund
Future of development with AI and Blockchain
Navdeep Garg
Debugging Tips and Tricks with Visual Studio 2019
Joseph Guadagno
Azure Containers
Abhishek Kant
Enterprise Architecture
Naveen Sharma
Bot Framework - learn it fast and look like a boss!
Allen O’Neill
Keynote
.Net Core & C# 8 Performance
David McCarter
Working with Azure kubernetes services
Ritesh Modi
Becoming an Architect
Vidyavrat Agarwal
Why Techies Need to Learn Product Management
Saurabh Jain
Lunch
Build a rules engine in .Net Core
Sanjay Vyas
Building CI and CD Pipeline using Azure DevOps
Sandeep Soni
Entity Framework Core - Tips and Tricks, Performance Optimization, and Tuning
Bassam Alugili
Hacking your way into Data Science
Sanket Verma
Speed up your .Net Core Website
Sourabh Somani
Azure
Magnus Mårtensson
Demystifying Open Distro for Elasticsearch
Suman Debnath
Future of Data
Shivam Ahuja
Tea Break
gRPC with C# and .Net Core
Mangesh Gaherwar
Panel 1
Essentials of Cloud security
Parveen Malik
Power platform and Dynamics 365
Deepesh Somani
Microservices - the gRPC Way
Viswanatha Swamy
Panel 2
Reserved
Reserved
Closing Note & Prize Distribution
Building Extensible .NET Core Applications with MEF
A plugin architecture lets an application gain new capabilities without changing its central business logic every time a feature is added. In a .NET Core or modern .NET solution, Managed Extensibility Framework (MEF) can provide a practical composition model for discovering implementations, matching them to contracts, and assembling services at runtime.
This approach suits systems that need interchangeable modules: reporting providers, payment connectors, document handlers, workflow steps, or AI services. It is especially useful for software teams working across Sydney, Melbourne, Brisbane, and other Australian technology hubs, where products often need to integrate with changing cloud services, local compliance requirements, and separate customer deployments.
Why a plugin architecture helps
A conventional application often grows around a large dependency-injection registration file and a collection of conditional statements. Adding a new provider may require editing core code, rebuilding the entire product, and releasing it to every customer. A plugin design moves optional functionality into separate assemblies with clear contracts.
MEF addresses this problem through composition. A host defines an interface, while an extension marks a class as an export that fulfils that interface. The host scans suitable assemblies, discovers the exports, and injects them into a collection or a selected service. The core application remains relatively stable while modules evolve independently.
This model is valuable for products with customer-specific editions. A logistics application might load a carrier integration for Melbourne and another for Perth; a learning platform could enable separate content providers; an internal tool might install an Azure storage module in one environment and a local file module in another.
The design also supports parallel development. A team can work on the host, while other developers build plugins against a versioned contract package. The same separation can make conference demonstrations and technical prototypes easier to maintain, much like the performance considerations discussed in ValueTask resource pools.
Selecting the right MEF libraries
MEF has more than one programming model, so package selection should be deliberate. The older System.ComponentModel.Composition API is familiar to many .NET Framework developers and uses attributes such as Export and Import. For .NET Core and modern .NET, the System.Composition family is commonly considered the cleaner MEF 2 option, with packages such as System.Composition.Hosting, System.Composition.Runtime, and System.Composition.TypedParts.
The MEF 2 style uses a ContainerConfiguration to assemble parts. A simplified host might look like this:
using System.Composition.Hosting;
using System.Reflection;
var configuration = new ContainerConfiguration()
.WithAssembly(typeof(IReportExporter).Assembly)
.WithAssembly(Assembly.LoadFrom(pluginPath));
using var container = configuration.CreateContainer();
var exporters = container.GetExports<IReportExporter>();
The exact package versions and supported target frameworks should be checked before committing to a production design. A solution targeting .NET 8 may have different dependency constraints from a long-lived .NET Core 3.1 product, and trimming or single-file publishing can affect reflection-based discovery.
MEF is a composition framework rather than a complete plugin security boundary. It can locate and construct components, but it does not automatically make untrusted code safe. If a third-party assembly could be malicious, use a separate process, operating-system permissions, container isolation, or a carefully controlled extension marketplace instead of loading it directly into the application process.
Defining stable contracts
The contract assembly is the most important part of the design. Keep it small, dependency-light, and focused on business capabilities rather than implementation details. A contract might contain an interface, a request model, a result model, and a small set of error abstractions:
public interface IReportExporter
{
string Format { get; }
Task<ExportResult> ExportAsync(
ReportData report,
CancellationToken cancellationToken);
}
public sealed record ExportResult(
string ContentType,
byte[] Content);
The host should depend on this assembly, while plugins reference it without referencing the host’s web project, database layer, or user-interface code. That prevents circular dependencies and makes the extension point portable across a console worker, ASP.NET Core service, or desktop administration tool.
Versioning deserves attention from the start. Adding a new method to an interface can break every existing plugin. Prefer a new interface, optional capability interface, or an adapter when a contract must grow. Use semantic versioning and document whether the host guarantees backward compatibility for one, two, or more plugin generations.
Avoid leaking framework-specific objects through the contract. Passing HttpContext, an Entity Framework DbContext, or an internal configuration class ties every extension to one host implementation. Plain records, interfaces, cancellation tokens, and carefully designed service abstractions are easier to test and upgrade.
Discovering and loading extensions
There are two common discovery strategies. The first scans a known directory for assemblies, loads each candidate, and asks MEF to inspect its exported parts. The second uses a configured list of assemblies, which offers stronger control and more predictable startup. Directory scanning is convenient for administrators, while explicit registration is easier to audit.
A plugin can expose an implementation with an export attribute:
using System.Composition;
[Export(typeof(IReportExporter))]
public sealed class CsvReportExporter : IReportExporter
{
public string Format => "csv";
public Task<ExportResult> ExportAsync(
ReportData report,
CancellationToken cancellationToken)
{
var bytes = CreateCsv(report);
return Task.FromResult(
new ExportResult("text/csv", bytes));
}
}
The host can request all exporters, select one by metadata, or compose a named capability. Metadata is useful when the plugin contract is broad:
[Export(typeof(IReportExporter))]
[ExportMetadata("Format", "csv")]
For larger products, place each extension in its own directory with its dependency files and manifest. Record the assembly name, plugin version, contract version, supported operating systems, and required configuration. This reduces ambiguity when several plugins depend on different versions of the same library.
Assembly loading becomes more complex when plugins carry conflicting dependencies. Modern .NET provides AssemblyLoadContext, which can help isolate load contexts, but it does not solve every compatibility issue. If extensions need independent lifecycles or potentially conflicting native libraries, an out-of-process plugin model may be a better fit than in-process MEF composition.
Managing dependencies and lifetimes
MEF composition and ASP.NET Core dependency injection can work together, but their responsibilities should be clear. MEF can discover plugin types, while the application’s service provider supplies logging, options, HTTP clients, and database abstractions. A plugin should receive host services through explicit imports or a small service facade rather than creating its own global service provider.
Constructor injection is generally preferable because it makes required dependencies visible. Optional imports can be appropriate for capabilities that a plugin can operate without, but excessive optional composition tends to hide configuration failures. A missing required export should produce a clear startup error that identifies the contract and assembly involved.
Lifetime decisions matter for resources such as sockets, caches, and database connections. A stateless exporter may be safely reused, while a component holding request-specific state should be created per operation. Async methods should accept cancellation tokens and avoid blocking calls, especially when a plugin runs inside an ASP.NET Core request.
Configuration should be isolated by plugin name or identifier. For example, Plugins:Csv:Delimiter is easier to manage than a collection of unrelated global keys. Secrets should come from a managed secret store or environment-specific provider rather than from a plugin DLL or checked-in JSON file. Teams deploying to Azure Australia East or Australia Southeast can then keep regional settings and credentials separate without recompiling extensions.
Testing, diagnostics, and operational safety
A plugin contract needs its own test suite. Contract tests can verify that every implementation returns valid content types, honours cancellation, handles empty input, and produces useful failures. The host should also test composition with missing assemblies, duplicate exports, incompatible versions, and malformed plugin metadata.
Logging should identify the plugin name and version in every important event. Startup logs can show discovered extensions, rejected assemblies, and composition errors. Health checks may report whether a required plugin is available, while optional extensions can be marked degraded rather than bringing down the whole service.
Australian deployments may process personal information covered by the Privacy Act 1988 and the Australian Privacy Principles. A plugin that exports reports, sends customer data to a SaaS endpoint, or records diagnostic payloads needs a clear data-flow review. Data residency, retention, access controls, and breach-response procedures should be considered alongside technical composition.
The same discipline applies to licensing and procurement. A plugin may introduce a commercial dependency, open-source obligations, or a vendor-specific cloud service. Australian Consumer Law can also be relevant when a product’s advertised capabilities depend on optional modules. Keep a software bill of materials and record which extension version was deployed to each customer environment.
Comparing extensibility approaches
MEF is most attractive when composition should be declarative and extensions are discovered from assemblies. It is less suitable when the system needs strict tenant isolation, polyglot modules, or frequent independent deployment. Comparing it with ordinary dependency injection and process-based integration helps clarify the boundary.
| Approach | Discovery model | Isolation | Best fit | Main trade-off |
|---|---|---|---|---|
| MEF | Attribute and assembly composition | Usually in-process | .NET plugins with shared contracts | Reflection and versioning require care |
| Built-in dependency injection | Explicit registration | In-process | Stable application-owned services | Less flexible for unknown modules |
| Reflection-only custom loader | Custom scanning and activation | Usually in-process | Small specialised extension systems | More code to maintain and diagnose |
| Separate process or worker | IPC, HTTP, or messaging | Stronger process boundary | Untrusted or independently deployed plugins | Operational and communication overhead |
| Webhook or SaaS integration | Network contract | Service boundary | External vendors and cloud platforms | Latency, availability, and data-governance concerns |
A useful rule is to use MEF when the host and plugins share the same runtime assumptions and a versioned .NET contract. Use built-in dependency injection for application internals that are known at compile time. Choose a separate process or network boundary when the extension has a different release cycle, requires stronger fault containment, or handles sensitive data in a way the host should not directly control.
Practical recommendations for a maintainable design
A production-ready implementation benefits from a small set of explicit engineering rules:
- Keep the contract assembly independent from the host’s UI, database, and web layers.
- Pin compatible MEF package versions and test composition against every supported target framework.
- Validate plugin manifests, versions, capabilities, and configuration before activation.
- Prefer explicit assembly allow-lists when extensions come from controlled deployments.
- Use cancellation, structured logging, and bounded resource lifetimes in every plugin operation.
- Isolate untrusted or failure-prone extensions in a separate process rather than relying on MEF for security.
- Maintain contract tests, a software bill of materials, and a rollback procedure for failed plugin updates.
For teams exploring AI-enabled extensions, the contract can expose a narrow capability such as ITextClassifier or ISummarisationProvider rather than embedding a particular model SDK throughout the host. That keeps providers replaceable as model costs, privacy rules, and latency requirements change; even exploratory machine learning projects benefit from this separation between an application capability and the model implementation.
A well-designed MEF solution therefore has three stable boundaries: the host controls lifecycle and policy, the contract defines capability, and each plugin owns its implementation. With version checks, observability, testing, and Australian data-governance requirements built into those boundaries, the architecture can grow without turning every new integration into a rewrite.
1, CBD, Maharaj Surajmal Road, Near Yamuna Sports Complex, Delhi, 110032
GENERAL QUERIES
Manish Tewatia
manish@csharpcon.com
+91-9718-431-042
TICKET QUERIES
Atul Gupta
conference@csharpcon.com
+91-9910-125-804