Deploy Windows Program (.NET Framework)

PENDAHULUAN

.. to run this application you must first install one of the following versions of  the .net framework v4.0.30319..

Alasan:
Walaupun sudah menginstall VC++ Redistributable Package, tapi belum menginstal .NET framework terbaru.

SOLUSI

Menginstall .NET Framework 4.5 (di website resmi Microsoft)
sumber: stackoverflow,

PERINGATAN

Berdasarkan pengalaman, tidak seperti VC++ Redistributable Package, untuk menginstal .NET Framework ini membutuhkan koneksi internet.

Advertisements

Konsep penting .NET (secara praktek)

PENDAHULUAN

Contoh error yang ditemui pada C++/CLI:
C4368: cannot define ___ as a member of managed ___ : mixed types are not supported

Alasan:
Karena belum mengerti konsep .NET, jadi mencampuradukkan tipe managed dan unmanaged (dalam hal ini, array).
SO1SO2

PENJELASAN
disarikan dari sini

Dua jenis alokasi memori: stack & heap
Stack bertanggung jawab menelusuri -keeping track- running memory di aplikasi yang sedang berjalan. Alokasi memori dan dealokasi memori pada stack menggunakan logika LIFO (Last In First Out).

Ketika suatu obyek diciptakan (misal class1 cls1 = new class1();), suatu pointer diciptakan di stack namun obyek yang sebenarnya diletakkan pada tipe memory yang berbeda, yaitu heap. Heap tidak menelusuri (keeping track) running memory. Heap adalah tumpukan obyek yang bisa diakses pada saat kapanpun (tidak melalui LIFO). Heap digunakan untuk alokasi memori dinamis.

Penting

– reference pointer dialokasikan pada stack
– class1 cls –> mengalokasikan stack variable cls1 (di-set sebagai null)
– class1 cls –> tidak mengalokasikan memory untuk instance Class1
– keyword new –> mengalokasikan memory pada heap
– ketika keluar dari suatu method, memory variable pada stack di-dealokasi degan menggunakan (fashion) LIFO.
– ketika keluar dari suatu method, heap memory tidak di-dealokasi, hanya stack memory yang di-dealokasi
– heap memory nantinya akan di-dealokasi dengan menggonakan garbage collector

(visualisasi alokasi/dealokasi memori yang simpel dan deskriptif. Gambar diambil dari codeproject.com)

Review tipe data: primitif, obyek
– primitif:
–> tidak kompleks, hanya memiliki satu nilai (besaran)
–> tipe data primitif membutuhkan memori statik
–> jika suatu data membutuhkan memori statik, makan ia akan dialokasikan di stack
– obyek:
–> kompleks, merefer ke obyek lain dan atau tipe data primitif lain
–> tipe data obyek memegang referensi dari beberapa nilai (tidak hanya satu), dan setiap nilai tersebut harus disimpan di dalam memori
–> tipe data obyek membutuhkan memori dinamis
–> jika suatu data membutuhkan memori dinamis, makan ia akan dialokasikan di heap

Tipe nilai dan tipe referensi
– tipe nilai (value type)
–> memegang data dan memory, keduanya pada lokasi yang sama
–> ketike meng-assign suatu nilai integer ke nilai integer lainnya, maka kita akan memiliki dua kopi (yang jika salah satunya diubah, maka kopi yang lainnya tidak ikut mengalami perubahan)
–> selain tipe data string atau obyek
– tipe referensi
–> memiliki pointer yang menunjuk lokasi memori
–> ketika kita meng-assign suatu obyek ke obyek lainnya, mereka (kedua obyek tersebut) akan menunjuk ke lokasi memori yang sama. Jika satu obyek diubah, maka obyek lain juga akan terpengaruh.
–> string atau obyek

Boxing dan unboxing
– Boxing
–> data bergerak dari tipe nilai ke tipe referensi
–> data bergerak dari stack ke heap
–> contoh: int i=1; object O =i;
– Unboxing
–> data bergerak dari tipe refernsi ke tipe nilai
–> data bergerak dari heap ke stack
–> contoh: int j = (int) O

Boxing dan unboxing ini memperlambat waktu eksekusi. Jadi sebisa mungkin, sebaiknya dihindari.

TENTANG Mixed Types

Library: native & .NET
CLR: memungkinkan language interop antara assembly

Traditional native heap memory managers
– traditional memory managers: data yang tersimpan di memori tidak pernah dipindahkan oleh sistem, melainkan hanya bisa dipindahkan oleh program (yang ditulis)
– suatu range memori berada pada kendali program, sampai ketika range memori tersebut tidak lagi di-referensi-kan
– pada titik ini garbage collector bisa membebaskan memori

Kasus run out of memory
– bukan (melulu) karena memory leak, tapi karena memory heap terfragmentasi
– fragmentasi memori: walaupun sebenarnya ada cukup memori yang tersisa untuk alokasi memori, namun space yang masih bebas (free space) pada blok yang bersebelahan (contiguous block) tidak cukup

 CLR garbage collector
– merupakan teknik manajemen memori yang sophisticated
– setiap garbage collection terjadi, obyek yang tersisa akan dipindah ke bagian awal heap
– ini berarti memory yang masih kosong selalu tersedia pada potongan memory yang bersebelahan pada range alamat heap yang lebih tinggi (bukan awal heap)
– hal ini membuat alokasi memori menjadi sangat cepat
– namun ini juga berarti, tidak seperti manajemn memori secara tradisional, pada .NET garbage collector, obyek pada GC heap dipindahkan oleh sistem (CLR).
– alamat memory yang mereferensi ke obyek akan diupdate oleh sistem

Masalah dengan unmanaged code
– Ketika alamat memori diupdate oleh sistem (CLR), sistem hanya mengetahui referensi memori yang berasal dari managed code.
– ini berarti, referensi apapun ke suatu obyek pada GC heap yang berasal dari unmanaged code tidak akan diupdate, dan program bisa berhenti setelah GC terjadi/bekerja

Apa itu mixed type
– adalah native class atau ref class yang memerlukan anggota obyek (baik melalui deklarasi atau penurunan/inheritance) untuk dialokasikan pada GC heap.

Terminology
ILDASM: Intermediate Language  Dis-assembler
Tool untuk melihat isi assembly dari setiap kelas atau method pada .NET application
ILDASM ada pada mesin/PC yang:
– sudah terinstal Visual Studio
– sudah mendownload .NET SDK

Review GUI Application (Windows Form) menggunakan VS2013

Identifikasi masalah

Saya ingin membangun suatu sistem berbasis windows form (GUI, bukan console/command line) untuk suatu aplikasi real time.

Keterbatasan

– Sistem tersebut diharapkan dibangun pada VS2013
– Pada VS2013, opsi “Windows Form Application” hanya tersedia pada VC#, tidak pada VC++

Mengapa menggunakan C++/CLI

– secara personal, bahasanya sudah lebih familiar dibanding C#
– aplikasi yang dibangun dengan C++/CLI diduga lebih cepat dari C# dan VB

Perlu diselidiki lebih lanjut

– apakah VC++ perform lebih baik pada aplikasi realtime ketimbang VC# dan VB?
– menurut link berikut, C++/CLI adalah memprogram .NET dalam bahasa C++, apakah ini berarti C++ sudah tidak sama dengan C++/CLI berkaitan dengan kecepatan untuk suatu aplikasi real time?

PRAKTEK
(dimodifikasi dari sini)
1. Membuat proyek baru
VC++ CLR, CLR Empty Project

2. Membuat form baru
Project, add new item, VC++ UI, Windows Form

PENTING (1):
– Pada C++/CLI VS2013 ini, entry point harus didefinisikan secara manual
– >> untuk bekerja dengan UI Controls, deklarasikan using namespace System, dan using namespace System::Windows::Forms
– >>eksekusi: enablevisualstyles(), inisiasi form dan jalankan
– >> atur konfigurasi proyek sehingga memiliki entry point fungsi Main
Implementasi:
pada ____.cpp (misalnya NamaForm.cpp pada proyek NamaProyek), edit menjadi seperti ini

#include "NamaForm.h"

using namespace System;
using namespace System::Windows::Forms;


[STAThread]
void Main(array<String^>^ args)
{
 Application::EnableVisualStyles();
 Application::SetCompatibleTextRenderingDefault(false);

 NamaProyek::NamaForm form;
 Application::Run(%form);
}

Edit properties: Click kanan pada nama project, properties, configuration properties, linker
– system, subsystem Windows,
– advanced, entry point: Main

3. Menambahkan form baru dan menghubungkannya dengan form lama

Project, add new item, VC++ UI, Windows Form

Misalnya untuk membuka NamaFormBaru dari suatu button pada NamaForm, double click button tersebut (pada visual editor), lalu ketikkan

NamaFormBaru ^ form = gcnew NamaFormBaru();
form->ShowDialog()

PENTING (2)
Tambahkan/include header NamaFormBaru pada bagian atas NamaForm (setelah #pragma once)

#include "NamaFormBaru.h"

 4. Melakukan sharing variable antar form (kasus 1: String)

Misalnya untuk mengirim string variabel InformasiText pada NamaForm (form lama) ke NamaFormBaru (form baru)

Ada 3 tahapan
a. Instansiasi variable string dengan tipe public pada NamaFormBaru
b. Buat konstruktor baru pada NamaFormBaru
c. Kirim data pada NamaForm dengan memanggil konstruktor baru NamaFormBaru

Secara detail
a. Instansiasi variabel string dengan tipe public pada NamaFormBaru
Tambahkan

public:
String ^InformasiText

b. Buat konstruktor baru pada NamaFormBaru
Kopi konstruktor NamaFormBaru yang sudah tersedia secara default

public:
NamaFormBaru(void)
{
InitializeComponent();
//
//TODO: Add the constructor code here
//
}

paste, lalu edit menjadi seperti ini

public:
Mainmenu(String ^text)
{
InitializeComponent();
InformasiText = text;
//TODO: Add the constructor code here
//
}

c. Kirim data pada NamaForm dengan memanggil konstruktor baru NamaFormBaru

Misalnya variable tersebut ingin dikirim/sharing ketika mengklik button pada NamaForm (form lama), maka event handler button click tersebut dimodifikasi (dari contoh sebelumnya, point 3) menjadi

String ^InformasiText = "yuhuu";
NamaFormBaru ^ form = gcnew NamaFormBaru(InformasiText);
form->ShowDialog()

 5. Melakukan sharing variable antar form (kasus 2: float)

Mirip dengan cara point 4, tapi ubah String ^namavariabel menjadi float namavariabel.

6. Launch/menjalankan program lain (.exe)
Lakukan

String ^FilePath = "C:\\somelink.exe";
Process::Start(FilePath);

Setelah mendeclare

using namespace System::Diagnostics;

7. Buka form dialog untuk membuka file

Lakukan

OpenFileDialog^ openFileDialog1 = gcnew OpenFileDialog;
openFileDialog1->ShowDialog();
String^ FilePath = openFileDialog1->FileName;

Hasil: file path
Bisa ditindaklanjuti dengan menjalankan/mengeksekusi file (point 6 di atas), misal: Process::Start(FilePath).

LAIN-LAIN
1. Apa yang terjadi ketika suatu button pada visual editor di-double click?
– penambahan event handler, misalnya gcnew System::EventHandler …
– penambahan fungsi kosong, misalnya System::Void button1_Click …

Singkatan

CLI: Common Language Infrastructure

Daftar error dan solusinya

Error Solusi
LNK1561: entry point must be defined Using namespace System::Windows::Form, edit konfigurasi agar entry point proyek dimulai dari fungsi Main.
Lihat “PENTING (1)”
 C2065: ‘NamaFormBaru’ undeclared identifier Include header NamaFormBaru pada bagian atas form pemanggil.
Lihat “PENTING (2)”
 C2653: ‘Process’ : is not a class or namespace name Deklarasi using namespace System::Diagnostics; (point 6)

Source control, Github

Dari youtube

Apa itu source control / version control system

– untuk kolaborasi (mengerjakan suatu proyek bersama tim)
– the art of managing changes to information

Terminology

– repository
– merge conflict

Command:

– git
– git clone
– git status (result: n0thing added to commit but untracked files present)
– git add (to add any changes –> ), git add . , git add -A
– git commit -m “message whatever”
– git push (to sync ‘up’ to repository)
– git pull (to sync ‘down’)
– git commit (esc :wq –> escape colon double-you q)

Workflow
– git pull : get everybody updates
– make changes
– git add -A, git commit -m “made blablabla more specific”

Menangani merge conflict
– manually revise
– save, git commit (result –> commit is not possible because you have unmerged files)
– git add -A, git commit, esc :wq
– git push

Personal remark

– sejenis subversion (SVN) repository –> youtube link, academic link

.NET, C++/CLI, CLR (usaha kedua)

Ini adalah usaha kedua untuk mencoba mengerti framework .NET dan implementasinya dalam C++.

Disarikan dari wikipedia, code project, functionx

.NET adalah framework software yang dikembangkan oleh Microsoft.

CLI: Common Language Infrastructure
Tujuan CLI adalah menyediakan platform yang netral-bahasa (language-neutral) untuk pengembangan dan eksekusi suatu aplikasi, termasuk di dalamnya: exception handling, garbage collection,security, dan interoperability.

CLR: Common language runtime
– adalah implementasi dari CLI.
– adalah execution engine dari .NET framework. Semua program .NET dieksekusi dibawah CLR untuk menggaransi (memastikan) beberapa sifat (properties and behaviors) dalam area manajemen memori, keamanan, dan exception handling.
– CLR membebaskan programmer dari keharusan memanajemen memori (alokasi dan membebaskan memori ketika selesai) —> mari bahas pada kesempatan selanjutnya

Windows Form
– adalah teknik membuat aplikasi komputer berbasis CLR
– menawarkan suatu seri obyek yang disebut Windows Control. Kontrol ini sudah diciptakan dalam framework .NET melalui berbagai kelas.

Performa
Karena garbage collector terintegrasi dalam .NET Framework dan sifatnya non deterministik (tidak diketahui kapan bekerjanya dan programmer tidak memiliki kontrol langsung), GC ini bis.a menimbulkan delay pada saat eksekusi

Pointer dalam C++/CLI
Jika di dalam C++ kita menggunakan * untuk menotasikan pointer, maka dalam C++/CLI kita menggunakan ^ (caret) untuk menotasikan handle.
Untuk membuat referensi baru (suatu tipe kelas atau nilai tertentu), kita mengalokasikannya dengan keyword “gnew”
Jika pada C++ * berpasangan dengan &, maka pada C++/CLI ^ berpasangan dengan %.

Terminology

IDE: Integrated Devel0pment Environment,
– contains compiler, interpreter, or both
– may include programming window for writing source code, debugger, visual editor (to create/edit GUI)
– e.g., MSVisual Studio, NetBeans, Eclipse

SDK: Software Development Kit, or DevKit
– koleksi software yang digunakan untuk mengembangkan aplikasi untuk device tertentu (spesifik) atau OS tertentu
– SDK biasanya termasuk IDE

GC: Garbage collector
– adalah manajemen memori secara otomatis
– GC berusaha untuk me-reklaim garbage (memori yang diduduki oleh obyek yang tidak lagi digunakan oleh program)

C#: C-sharp
– adalah  bahasa yang didesain oleh Microsoft untuk .NET dan CLI (Common Language Infrastructure)
– adalah bahasa pemrograman OOP