惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
S
Secure Thoughts
I
Intezer
Project Zero
Project Zero
Stack Overflow Blog
Stack Overflow Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
F
Full Disclosure
P
Proofpoint News Feed
T
The Exploit Database - CXSecurity.com
人人都是产品经理
人人都是产品经理
博客园_首页
J
Java Code Geeks
Recorded Future
Recorded Future
K
Kaspersky official blog
GbyAI
GbyAI
S
Schneier on Security
The Cloudflare Blog
Spread Privacy
Spread Privacy
C
Cisco Blogs
The Hacker News
The Hacker News
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
Know Your Adversary
Know Your Adversary
T
Tenable Blog
A
Arctic Wolf
Blog — PlanetScale
Blog — PlanetScale
H
Hacker News: Front Page
The Last Watchdog
The Last Watchdog
O
OpenAI News
Last Week in AI
Last Week in AI
B
Blog RSS Feed
T
Troy Hunt's Blog
G
GRAHAM CLULEY
N
Netflix TechBlog - Medium
Vercel News
Vercel News
量子位
The Register - Security
The Register - Security
Google Online Security Blog
Google Online Security Blog
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
U
Unit 42
Security Archives - TechRepublic
Security Archives - TechRepublic
C
Cyber Attacks, Cyber Crime and Cyber Security
N
News and Events Feed by Topic

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
C# JVM Guide: JDK, CLR & Java Interop for .NET
JNBridge · 2026-05-04 · via DEV Community

If you mostly live in .NET, the Java platform can look like a parallel universe: JVM, JDK, JARs, app servers, bytecode. The useful shortcut is to map each concept back to something you already know from C# and the CLR.

This guide is a translation layer for .NET developers: what the JVM is, how the JDK compares to the .NET SDK, and what your real options are when a C# system needs to work with Java code in production.


> TL;DR — Key Takeaways
>
> – The C# JVM equivalent is the Common Language Runtime (CLR) — both are managed-code virtual machines that handle bytecode execution, garbage collection, and JIT compilation.
> – The JDK maps directly to the .NET SDK — both bundle a compiler, runtime, and standard class library.
> – You cannot run C# directly on the JVM (or Java on the CLR) without translation tools.
> – The best way to bridge C# and Java in production is in-process interop — tools like JNBridgePro let you call Java objects from C# (and vice versa) without REST wrappers or rewrites.
> – IKVM is limited to Java 8 bytecode; for modern JDK versions, you need a commercially supported solution.


If you’re a .NET developer, you’ve almost certainly encountered the C# JVM question: how do these two platforms compare, can they interoperate, and what happens when your application needs both? This guide answers every part of that question from a .NET perspective.

We’ll walk through the Java platform — JVM, JDK, and J2EE — drawing clear parallels to the .NET ecosystem you already know. Then we’ll cover every realistic approach to bridging the C# JVM divide, from REST APIs to in-process interop with JNBridgePro.


Table of Contents

  • What Is the JVM? (The .NET Developer’s Answer)

  • The JDK Explained for .NET Developers

  • CLR vs. JVM: Full Platform Comparison

  • What Is the Difference Between J2EE and ASP.NET?

  • Can C# Run on the JVM?

  • Can Java Run on the CLR? IKVM and GraalVM

  • How to Connect C# and Java: The 4 Real Options

  • When You Need In-Process C# JVM Bridging

  • Getting Started with JNBridgePro

  • FAQ: C# JVM, JDK, and .NET Java Interop


  • What Is the JVM? (The .NET Developer’s Answer)

    The Java Virtual Machine (JVM) is Java’s equivalent of the Common Language Runtime (CLR). If you understand one, you already understand most of the other.

    The CLR takes your compiled C# — in the form of Intermediate Language (IL) — and executes it. It handles memory management, garbage collection, JIT compilation, type safety, and threading. The JVM does the same thing for Java bytecode.

    Both are stack-based virtual machines. Both use just-in-time compilation to convert their respective intermediate representations into native machine code at runtime. Both provide automatic memory management through garbage collection. The architectural similarities are not coincidental — the CLR was designed with full awareness of the JVM’s strengths and weaknesses.

    Concept .NET Java
    Source language C#, F#, VB.NET Java, Kotlin, Scala
    Compiled to IL (Intermediate Language) Java bytecode
    Executed by CLR (Common Language Runtime) JVM (Java Virtual Machine)
    Compilation unit Assembly (.dll / .exe) JAR / class files

    The key difference is openness. The JVM specification is an open standard with multiple competing implementations: Oracle’s HotSpot, Eclipse’s OpenJ9, Amazon’s Corretto, Azul’s Zulu, and GraalVM. The CLR historically had one implementation from Microsoft, though .NET is now open source and cross-platform.

    Why This Matters to You

    When someone says their library “runs on the JVM,” they mean it’s compiled to Java bytecode — just like when you say your library “targets .NET,” you mean it compiles to IL. The JVM is the execution engine, not the language. This is why languages like Kotlin and Scala can coexist with Java: they all compile to the same bytecode and run on the same managed code runtime.


    The JDK Explained for .NET Developers

    If the JVM is the CLR, then the Java Development Kit (JDK) is the .NET SDK.

    The .NET SDK gives you everything needed to build .NET applications: the compiler (csc/dotnet build), the runtime (CLR), the base class libraries (BCL), and tooling. The JDK does the same for Java: it includes the Java compiler (javac), the JVM, the standard library, and development tools.

    Component .NET SDK JDK
    Compiler Roslyn (csc) javac
    Runtime CLR JVM (HotSpot, etc.)
    Standard library BCL (Base Class Library) Java Standard Library
    Package format NuGet (.nupkg) JAR / Maven artifact
    Build tool MSBuild / dotnet CLI Maven / Gradle
    Package manager NuGet Maven Central
    REPL C# Interactive jshell (JDK 9+)

    There’s also the JRE (Java Runtime Environment) — a subset of the JDK containing only what’s needed to run Java applications. The .NET world had a similar split historically: you’d install the “.NET Framework Runtime” on servers and the full SDK on dev machines.

    C# JDK Compatibility: What Version Do You Need?

    Java now follows a six-month release cadence with Long-Term Support (LTS) versions every two years. As of 2026, the current LTS versions are Java 17, 21, and 25.

    If you’re connecting C# to JVM-based systems, you’ll typically need JDK 11 or later installed. JNBridgePro supports a range of JDK versions — see the latest .NET 9 and Java 21 compatibility details.


    CLR vs. JVM: Full Platform Comparison

    Here’s a comprehensive side-by-side for .NET developers evaluating the .NET JVM landscape:

    Feature JVM / Java CLR / .NET
    Primary language Java C#
    Other languages Kotlin, Scala, Groovy, Clojure F#, VB.NET
    Runtime JVM (HotSpot, OpenJ9, GraalVM) CLR (.NET Runtime)
    Intermediate format Java bytecode (.class) IL / MSIL (.dll)
    Garbage collection G1, ZGC, Shenandoah (pluggable) Generational GC (workstation/server)
    JIT compilation C1/C2 tiered (HotSpot) RyuJIT
    AOT compilation GraalVM Native Image .NET Native AOT
    Generics Type erasure (no reification) Reified (preserved at runtime)
    Value types Project Valhalla (preview) Structs (first-class)
    Properties Convention-based getters/setters Language-level get/set
    Async model Virtual Threads (Java 21+) async/await
    Enterprise framework Jakarta EE (formerly J2EE) ASP.NET Core
    ORM Hibernate, JPA Entity Framework Core
    Cross-platform Yes (since inception) Yes (.NET 5+)
    License OpenJDK (GPLv2+CE) MIT License

    A few things stand out:

    • Generics: Java’s type erasure means generic type information is lost at runtime. If you’ve relied on reflection over generic types in C#, you’ll find Java’s approach limiting.
    • Value types: C#’s struct has no direct Java equivalent yet — Project Valhalla is changing this.
    • Async: Instead of C#’s async/await state machines, Java 21 introduced Virtual Threads — lightweight threads managed by the JVM that make blocking code scale like async code.

    What Is the Difference Between J2EE and ASP.NET?

    J2EE (Java 2 Platform, Enterprise Edition) is Java’s enterprise application framework — the equivalent of ASP.NET Core plus the broader .NET enterprise ecosystem. J2EE defines specifications for servlets, EJBs, JMS messaging, JPA persistence, and more. It was renamed to Java EE and eventually transferred to the Eclipse Foundation as Jakarta EE.

    The biggest architectural difference: Java enterprise apps deploy to an application server (Tomcat, WildFly, WebSphere) that provides runtime services. ASP.NET Core is self-hosted — your application is the server via Kestrel.

    Java / Jakarta EE .NET Equivalent
    Servlets / JSP ASP.NET Core MVC / Razor Pages
    JAX-RS (REST APIs) ASP.NET Core Web API
    JPA / Hibernate Entity Framework Core
    JMS (Java Message Service) Azure Service Bus, RabbitMQ
    EJB (Enterprise JavaBeans) DI + services (no direct equivalent)
    CDI (Dependency Injection) Microsoft.Extensions.DI
    JSF (JavaServer Faces) Blazor
    Application Server (Tomcat) Kestrel (self-hosted)

    For .NET developers who need to integrate with J2EE or Jakarta EE services, understanding this architecture is critical. Many enterprise Java systems expose EJBs or JMS queues that don’t have REST endpoints. This is exactly where a C# to Java bridge tool becomes essential — it lets your .NET code call into Java objects directly, without requiring the Java side to expose web services.


    Can C# Run on the JVM?

    No — not directly. C# compiles to IL (Intermediate Language), which the CLR executes. The JVM executes Java bytecode — a completely different instruction set. You can’t take a .NET assembly and load it into the JVM any more than you can run an x86 binary on an ARM processor without translation.

    There have been historical attempts:

    • Mainsoft Grasshopper (mid-2000s) compiled .NET bytecode to Java bytecode, allowing ASP.NET apps to run on Java application servers. It’s been dead for over a decade.
    • Cross-compilation is theoretically possible, but no one maintains such a tool today. The languages have diverged enough — value types, LINQ, async/await, properties, events — that faithful translation would be enormously complex.

    The practical answer isn’t running C# on the JVM. It’s running C# and Java side by side and letting them communicate through a bridge. The right approach depends on your use case — see the bridging options below.


    Can Java Run on the CLR? IKVM and GraalVM

    IKVM.NET

    IKVM was an open-source project that converted Java bytecode to .NET IL, letting you reference Java libraries as .NET assemblies. For simple libraries, it worked well.

    The catch: IKVM supports only Java 8 bytecode. The original project went dormant around 2017. A community fork revived it with .NET Core support, but it still can’t handle Java 11+ features — modules, records, sealed classes, virtual threads. For production systems using modern Java, IKVM is not viable. See our detailed guide on migrating from IKVM to JNBridgePro.

    GraalVM

    GraalVM is Oracle’s polyglot virtual machine. Its Native Image tool can compile Java libraries into native shared libraries with C-compatible entry points, which C# can call via P/Invoke.

    This works but requires significant effort: you must define the C API surface, handle marshaling manually, and deal with GraalVM’s closed-world assumptions. GraalVM is powerful technology, but it’s not designed to be a C# JVM bridge.


    How to Connect C# and Java: The 4 Real Options

    When your application needs both .NET and Java, here are your realistic choices:

    1. REST APIs / Web Services

    Wrap Java functionality in a REST API (Spring Boot, Quarkus) and call it from HttpClient.

    • ✅ Works when the Java side is already a service
    • Serialization overhead and network latency
    • ❌ Two services to deploy, monitor, and scale
    • ❌ Loss of type safety at the boundary

    2. Message Queues (Kafka, RabbitMQ)

    Good for asynchronous, event-driven architectures. Not suitable when you need synchronous method-level calls.

    3. gRPC / Process-Level Interop

    Run the JVM and CLR as separate processes communicating via gRPC or named pipes. Better than REST for performance, but still two processes and serialization overhead.

    4. In-Process Bridging with JNBridgePro

    JNBridgePro runs the JVM and CLR in the same process with direct, in-memory method calls. No serialization. No network hops. No REST wrappers.

    csharp
    // Call a Java HashMap from C# — via JNBridgePro proxy
    var map = new java.util.HashMap();
    map.put("key", "value");
    string result = (string)map.get("key");

    This isn’t calling a web service. The JVM is loaded in-process, and method calls cross the JVM-CLR boundary directly in memory — with full IntelliSense, type checking, and debugging support.

    You can also call C# from Java using the same bridge, making it a bidirectional interop solution.


    When You Need In-Process C# JVM Bridging

    Let’s get specific about when in-process bridging beats a service boundary.

    Java Libraries Without REST Wrappers

    Your organization has a proprietary Java library for risk calculations, PDF generation, or scientific computation — 500,000 lines of battle-tested code with no REST API. With JNBridgePro, you reference the JAR directly from your .NET project. No wrapper needed.

    Enterprise Java Systems (.NET J2EE Integration)

    Your company runs enterprise Java — EJBs, JMS queues, JNDI lookups. Your new frontend is ASP.NET Core. These Java enterprise APIs weren’t designed for HTTP. JNBridgePro lets your C# code interact with J2EE components natively — look up an EJB, subscribe to a JMS queue — all from C#.

    Incremental Migration

    You’re migrating from Java to .NET (or vice versa). Running everything as microservices doubles your infrastructure complexity. In-process bridging lets you migrate one class at a time, with the bridge handling cross-platform calls during the transition.

    Performance-Sensitive Integration

    When milliseconds matter — financial systems, real-time analytics — HTTP serialization overhead is unacceptable. In-process calls via JNBridgePro happen in microseconds, not milliseconds.

    > Why not just rewrite? Because rewrites fail. Joel Spolsky called it “the single worst strategic mistake any software company can make.” The code you’re replacing encodes years of bug fixes and domain knowledge. Bridging lets you use what works and build what’s new.


    Getting Started with JNBridgePro

    JNBridgePro supports two communication modes:

  • Shared memory (in-process) — The JVM runs inside your .NET process. Fastest integration with zero serialization overhead. Ideal for library-level calls.

  • TCP/IP — JVM and CLR run in separate processes or on separate machines. Use when in-process hosting isn’t feasible.
  • The setup workflow:

  • Install JNBridgePro and point it at your Java classes (JARs or class directories)

  • Generate .NET proxies using the GUI or command-line tool — creates C# classes mirroring the Java API

  • Reference the proxy assembly from your .NET project

  • Write C# code that calls Java objects through the proxies — with full IntelliSense and debugging
  • No Java code changes required. No REST endpoints to build. No serialization formats to define.


    FAQ: C# JVM, JDK, and .NET Java Interop

    Does C# run in a VM similar to Java’s JVM?

    Yes. C# runs on the Common Language Runtime (CLR), which serves the same role as the JVM. Both are managed-code virtual machines that execute an intermediate bytecode format, provide automatic garbage collection, enforce type safety, and use JIT compilation to generate native machine code at runtime. The CLR executes IL (Intermediate Language); the JVM executes Java bytecode. They are architecturally parallel but not interchangeable — code compiled for one cannot run on the other without a bridge like JNBridgePro.

    What is the equivalent of the JVM in C#?

    The CLR (Common Language Runtime) is the C# JVM equivalent. Both are stack-based virtual machines that compile an intermediate representation to native code at runtime. The key difference: the JVM was built for Java specifically, while the CLR was designed to be language-neutral, supporting C#, F#, and VB.NET from the start.

    Can you compile C# to run on the JVM?

    No — there is no maintained tool that compiles C# to JVM bytecode. Historical projects like Mainsoft Grasshopper attempted this but are long abandoned. The practical solution is interop, not porting: run both runtimes and bridge them using JNBridgePro, REST APIs, or gRPC.

    What happened to IKVM? Can it replace a C# JVM bridge?

    IKVM converted Java bytecode to .NET IL, allowing Java libraries to run on the CLR. The original project went dormant around 2017; a community fork revived it with .NET Core support but remains limited to Java 8. For modern Java (11+), enterprise integration, or production systems, JNBridgePro is the recommended alternative.

    How does JNBridgePro handle C# JDK compatibility?

    JNBridgePro is regularly updated to support new JDK releases — including Java 21 with .NET 9. It works with the JDK you already have installed. The proxy generation tool reads your Java classes regardless of JDK version (within supported ranges), and the runtime bridge handles all type conversion and marshaling between the CLR and JVM.

    Does the .NET SDK include JVM or JDK support?

    No. The .NET SDK and the JDK are completely separate toolkits. To work with both platforms, install them independently and use a bridging tool for interop.


    The practical takeaway

    For many teams, the right answer is still a service boundary: HTTP, gRPC, queues, or another explicit integration layer. But when you need object-level calls, shared types, low-latency execution, or access to an existing Java library without rewriting it, you need something closer than another API wrapper.

    That is where Java/.NET bridging earns its keep: keep both runtimes, keep the working code, and connect them intentionally.