Assembly a jazyková interoperabilita

Transkript

Assembly a jazyková interoperabilita
1
Assembly a jazyková interoperabilita
ř
Cílem následující ukázky je poskytnout p íklad nazna ující jen n co málo více, než je
hello, world. Bude se jednat o malou knihovnu pro ešení kvadratické rovnice. Téma
opravdu elementární, pro demonstra ní ú ely však bohat sta í. Tuto knihovnu spat íte v
n kolika programovacích jazycích, což nám p edstaví .Net platformu jako vícejazykovou,
provázanou s mnoha sv ty1. Navíc si také p iblížíme pojem rodina jazyk C, kam C#
pat í.
č
ě
ř
ř
č
č
ě
č
ř
ě
ř
ě
ů
ř
ř
Na platform .Net jsou assembly soubory s p íponou *.exe nebo *.dll, obsahující jednu
nebo více t íd p eložených do mezijazyka CIL. Krom tohoto ízeného kódu obsahují v
tzv. manifestu rovn ž metadata, t.j. sebepopisné informace o t chto t ídách a mohou
obsahovat i další atributy. Pokud chceme budovat knihovnu, je žádoucí její t ídy
zkompilovat do samostatného assembly s p íponou *.dll. Takové assembly neobsahuje
vstupní bod, metodu Main(). Knihovnu m žeme potom znovu použít v jiné aplikaci, bez
nutnosti kompilovat opakovan zdrojový kód.
ě
ř
ř
ř
ě
ř
ě
ě
ř
ř
ů
ě
ř
ř
M žeme za ít návrhem t ídy v nadjazykové podob , pro tento ú el byl vytvo en Unified
Modelling Language – UML jazyk. Na obrázku je vid t UML diagram popisující lenské
prom nné (složky, fields) a lenské funkce (metody) které chceme implementovat.
Rovn ž vidíme, že každá t ída .Netu je potomkem t ídy System.Object.
ů
č
ě
č
ě
ě
č
ř
ě
1
Ř
íká se tom Cross Language Interoperability
ř
č
2
ř
Vhodným nástrojem (nap . MS Visio, které je sou ástí Visual Studia .Net Architect) lze
z tohoto diagramu vygenerovat kostru zdrojového kódu.
č
Ta vypadá v C# takto
using System;
namespace KvadrRovLib
{
public class Solver
{
private double a,b,c;
public Solver(){}
public void Read(){}
public void Solve(){}
private double Read(string caption){}
private double discriminant(double a,double b,double c){}
}
}
3
a na cvi ení m že být nabídnuta k dopln ní kódu.
č
ů
ě
ř
A takhle vypadá kostra ve Visual Basicu .Net (VB). VB nepat í do rodiny C a je to vid t.
ě
Imports System
Namespace KvadrRovLib
Public Class Solver
Inherits Object
Private a As Double
Private b As Double
Private c As Double
Public Sub Solver ()
End Sub
Public Sub Read ()
End Sub
Public Sub Solve ()
End Sub
Private Function Read (ByVal caption As String) As Double
End Function
Private Function discriminant (ByVal a As Double, _
ByVal b As Double, _
ByVal c As Double) _
As Double
End Function
End Class
End Namespace
Visio umí vygenerovat i kostru pro ANSI/ISO C++. Jazyk C++ je následník jazyka C,
který jej uvedl do sv ta objektového programování a byl šlágrem 90tých let minulého
století. V C++2 musíme mít hlavi kový (*.h) soubor, který je pot eba ší it spole n
s binárními soubory. Ta totiž v C++ na rozdíl od assembly neobsahují metadata (
v p ípad data o funkcích, t ídách, metodách ...).
ě
ř
ř
č
ř
č
ř
ě
#ifndef __SOLVER__
#define __SOLVER__
#include <string>
using namespace std;
namespace KvadrRovLib
{
class Solver
{
private:
double a,b,c;
public:
Solver();
void Read();
void Solve();
private:
double Read(string caption);
2
Takhle vypadá ne ízená varianta C++, Visual C++ umí generovat i ízený kód. Zdrojový kód pro ízené
C++ je v dodatku.
ř
ř
ř
ě
4
double discriminant(double a,double b,double c);
};
}#endif // __SOLVER__
A zde je soubor *.cpp s kostrou definic metod
#include ".\solver.h"
namespace KvadrRovLib
{
Solver::Solver(){}
void Solver::Read(){}
void Solver::Solve(){}
double Solver::Read(string caption){
}
double Solver::discriminant(double a,double b,double c){}
}
Protože jsou definice odd leny od deklarací, je nutno u každé metody znovu dodat vazbu
na metadata. Tím myslím, že p ed identifikátorem metody stojí odd leno ty te kou ::
jméno t ídy, ke které metoda náleží. Rovn ž je p ítomen p íkaz preprocesoru #include,
kterým umožníme kompilátoru C++ provést kontrolu metadat. V .Netu, jak již víme,
jsou metadata integrální sou ástí assembly a proto ani ty te ku ani hlavi kové soubory
s deklaracemi neuvidíme. Metadata si vygenerují v procesu kompilace a jsou neodlu n
spojena s ízeným kódem v assembly.
ě
ř
ř
ě
ř
ř
č
č
ř
ě
ř
č
č
č
č
č
ř
Vra me se proto rychle k našemu C#. Po dopln ní t l metod zdrojový kód vypadá takto:
ť
ě
ě
“Matematická” knihovna v C# (Solver.cs)
1 using System;
2 namespace KvadrRovLib
3 {
4
public class Solver
5
{
6
public Solver()
7
{
8
Random rand = new Random();
9
a = rand.NextDouble();
10
b = rand.NextDouble();
11
c = rand.NextDouble();
12
}
13
14
private double a, b, c;
15
16
private double Read(String caption)
17
{
18
Console.WriteLine(caption);
19
return double.Parse(Console.ReadLine());
20
}
21
22
public void Read()
23
{
24
a = Read("a:");
ě
5
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55 }
b = Read("b:");
c = Read("c:");
}
private double discriminant(double a, double b, double c)
{
return b*b-4*a*c;
}
public void Solve()
{
double d = discriminant(a,b,c);
if (d == 0)
{
Console.WriteLine(- b / (2 * a));
return ;
}
if (d > 0)
{
Console.WriteLine((- b + Math.Sqrt(d))/(2*a));
Console.WriteLine((- b - Math.Sqrt(d))/(2*a));
}
else
{
double r = Math.Sqrt(- d) / (2 * a);
Console.WriteLine("{0}+{1}i",- b/ (2 * a),r);
Console.WriteLine("{0}-{1}i",- b/ (2 * a),r);
}
}
}
ř
ř
Na ádku 6 je deklarován implicitní konstruktor t ídy Solver. Implicitní znamená, že
nemá parametry. Pokud bychom ho nenapsali, doplní si jej p itom p eklada automaticky
sám (prázdný). My jsme implicitní konstruktor napsali. Funkcí konstruktor je
inicializovat data a uvést instance t ídy do provozuschopného stavu. Proto se
konstruktory volají automaticky p i vytvá ení instancí (objekt ). To se práv d je na
ádku 8, kde je vytvá ena instance rand t ídy System.Random. T ída Solver má t i
lenské privátní prom nné typu double pro koeficienty kvadratické rovnice. Na ádcích
9–11 jsou tyto prom nné inicializovány pomocí volání metody NextDouble() objektu
rand.
ř
ř
č
ů
ř
ř
ř
ů
ř
ř
ě
ř
ě
ř
ř
ř
č
ě
ě
Ř
ádkem 16 za íná privátní metoda Read s parametrem caption typu string. Jejím ú elem
je p e íst prom nnou typu double a p edat ji jako návratovou hodnotu. Parametr caption
slouží jako náv ští pro uživatele. ádek
č
č
ř
ř
č
ě
Ř
ě
19
return double.Parse(Console.ReadLine());
ř
ř
ř
volá statickou metodu Parse t ídy double, která se pokusí zkonvertovat et zec p e tený z
klávesnice na reálné íslo s dvojitou p esností, v opa ném p ípad se vyhodí výjímka, tu
však pro jednoduchost neodchytáváme.
ě
ř
č
ř
č
ě
č
6
Ř
ádek
37
if (d == 0)
obsahuje dvojité == což je logický test rovnosti (v C rodin tradi ní) jednoduché = je
p i azovací p íkaz (v Pascalu = a :=, VB si pochopí sám).
ě
ř
ř
č
ř
ř
Kone n následující ádek
č
ě
50
Console.WriteLine("{0}+{1}i",- b/ (2 * a),r);
obsahuje zajímavou variantu statické metody WriteLine. Prvním parametrem je
formátovací et zec, který obsahuje zna ky {0},{1}, …,{n}. Za formátovacím et zcem
následují parametry par0, par1,...,parn. Metoda WriteLine zkonvertuje parx na et zec a
substituuje jím všechny výskyty zna ek {x} ve formátovacím et zci. Výsledný et zec
se objeví jako nový ádek textu na konzole.
ř
ř
ě
č
ě
ř
ě
ř
č
ř
ě
ě
ř
Zbytek kódu je snad sdostatek sebepopisný.
Program v C# používající tuto knihovnu (KvadrRov1.cs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
using System;
using KvadrRovLib;
namespace kursyCS
{
class TridniObal
{
static void Main()
{
Solver sol = new Solver();
sol.Solve();
sol.Read();
Console.WriteLine("Reseni:");
sol.Solve();
Console.ReadLine();
}
}
}
ř
ř
Na ádku 2 vidíme p íkaz using KvadrRovLib, který nám umožní zkrátit identifikátory.
Soubor deklaruje t ídu TridniObal která bude sou ástí jmenného prostoru kursyCS.
Metoda Main() obsahuje na ádku 10 p íkaz new, který vytvo í instanci t ídy
KvadrRovLib.Solver a odkaz (adresu) na tuto instanci uloží do prom nné sol typu
KvadrRovLib.Solver. Na ádcích 11 – 15 se sekven n volají ve ejné (public) metody
naší t ídy Solver. Nejd íve je voláno Solve() nad stavem instance sol, do kterého ji uvedl
implicitní konstruktor. Vy eší se kvadratická rovnice s koeficienty vygenerovanými
náhodným generátorem. Poté m že uživatel zadávat svoje koeficienty a ode íst ešení z
ř
č
ř
ř
ř
ř
ě
ř
ř
č
ř
ě
ř
ř
ř
ů
č
7
ř
konzoly. Na 15. ádku se eká na Enter, což v jistých situacích zamezí ne ekanému
zmizení konzolového okna.
č
č
P eklad a spušt ní programu
ř
ř
ř
Knihovnu a program ji používající p eložíme do ízeného kódu (CIL) p íkazy
csc /target:library solver.cs
csc kvadrrov1.cs /reference:solver.dll
ř
ř
ř
Nezapome te si nejd íve nastavit prost edí. V pracovním adresá i vznikly dv assembly
solver.dll a kvadrrov1.exe. Parametr /target:library za ídí, že vzniklé assembly bude mít
p íponu *.dll. Pokud tento parametr neuvedeme, p eklad skon í chybou, protože pro
*.exe je vyžadována p ítomnost metody Main(). Parametr /reference zjistí na základ
metadat v assembly solver.dll zda jsou p ítomny všechny t ídy a metody volané z
kvadrrov1.cs a uloží vazbu na solver.dll do assembly kvadrrov1.exe. Spustíme
kvadrov1.exe
ň
ě
ř
ř
ř
č
ř
ě
ř
ř
ř
ř
Samoz ejm , že náš program mohl vzniknout jako jediné assembly, nap . tak, že bychom
ob t ídy umístili do jediného souboru a rovn ž st tak zjednodušili p íkazy pro kompilaci.
Takto ale m žeme použít kdykoliv t ídu KvadrRovLib.Solver aniž bychom manipulovali
se zdrojovým kódem.
ě
ř
ř
ě
ě
ř
ů
Dodatky pro zvláš odolné jedince
ť
Platforma .Net podporuje mnoho jazyk
S Visual Studiem 2003 dostanete 5 .Netových jazyk C#, J#, Jscript, VB, C++ (to umí i
nativní kód a je dodáno s nativními knihovnami)3. Dalších více než 20 jazyk m žete
získat z jiných, asto univerzitních zdroj .
ů
ů
č
3
ů
C++, C#, J#, Jscript pat í do rodiny C jazyk
ř
ů
ů
8
MS.Net je navržen tak, aby si každý vývojá mohl vybrat jazyk podle toho, který nap .
nejvíce umí, nebo spíše ten který, se pro danou problematiku nejvíce hodí. asto se jedná
o tradici. Intenzivní výpo ty se nap . programují nej ast ji ve Fortranu, nov ji pak v
C++, Jav a C#. Samoz ejm se rozhodují v tšinou týmy a jednotlivci se musí
p izp sobit. Nejd ležit jší je v moderním vývoji znovupoužitelnost kódu a tehdy se
musejí p ekonávat jazykové bariéry. Program ve finan nictví psaný ve Visual Basicu
nap . pot ebuje používat knihovnu psanou v C++. K tomu d íve sloužil a slouží COM a
CORBA, což jsou složité a t žkopádné technologie. V .Netu to prost díky spole ným
typ m (CTS Common Type Specification) a stavb jazyk (Common Language
Specification) není žádný problém. Samoz ejm musí jít o programy psané pro .Net verze
t chto jazyk , používající FCL. V následující ukázce p jde ješt o více.
ř
ř
Č
č
ě
ř
ů
ř
ů
č
ř
ě
ě
ě
ě
č
ř
ř
ě
ř
ř
ě
ů
ů
ě
ř
ě
ů
ě
č
ě
ů
ě
Sun Java má mnoho spole ných rys s .Netem, je ovšem v podstat jednojazyková.
Existuje velké množství kódu v jav . P edpokládejme, že máme p ístup ke zdrojovému
kódu. M žeme si vybrat .Netový jazyk který je Sun Jav velmi blízko, je to J#. Pomocí
kompilátoru J# (vjc.exe) m žeme vyrobit ízený modul, který potom budeme
modifikovat nap . ve Visual Basicu a používat nakonec v C#. M žeme ovšem rovn ž
použít Java Conversion Assistant pro (polo)automatickou konverzi zdrojového kódu
Javy na zdrojový kód C#. Java má v .Netu trochu v tší podporu, než by se ekalo, do jisté
míry je podporován nejen jazyk, ale i runtime (Java platforma).
č
ů
ě
ě
ř
ř
ů
ě
ů
ř
ů
ř
ě
č
ě
V p edchozím jsme napsali knihovnu na ešení kvadratické rovnice, mohli jsme si to ale
odpustit, kdybychom m li k dispozici zdrojový kód v Sun jav .
ř
ř
ě
ě
“Matematická“ knihovna v isté Sun Jav (Solver.java)
package KvadrRovLib;
public class Solver
{
public Solver()
{
a=Math.random();
b=Math.random();
c=Math.random();
}
private double a,b,c;
private double Read(String caption)
{
byte[] buf = new byte[100];
System.out.println(caption);
double r=0;
try
{
System.in.read(buf);
}
catch(java.io.IOException exc)
{
System.out.println(exc.toString());
9
}
String str = new String(buf).trim();
r = Double.parseDouble(str);
return r;
}
public void Read()
{
a = Read("a:");
b = Read("b:");
c = Read("c:");
}
private double discriminant(double a, double b, double c)
{
return b*b-4*a*c;
}
public void Solve()
{
double d = discriminant(a,b,c);
if(d==0)
{
System.out.println(-b/(2*a));
return;
}
if(d>0)
{
System.out.println((-b+Math.sqrt(d))/(2*a));
System.out.println((-b-Math.sqrt(d))/(2*a));
}
else
{
double r = Math.sqrt(-d)/(2*a);
System.out.print(-b/(2*a));
System.out.print("+");
System.out.print(r);
System.out.print("i");
System.out.println();
System.out.print(-b/(2*a));
System.out.print("-");
System.out.print(r);
System.out.print("i");
System.out.println();
}
}
}
Program v Jav používající tuto knihovnu (KvadrRov.java)
import KvadrRovLib.*;
public class KvadrRov
{
public static void main(String[] args)
{
Solver sol = new Solver();
10
sol.Solve();
sol.Read();
System.out.println("Reseni:");
sol.Solve();
}
}
Jak to sestavíme a spustíme pod Sun JDK (Java Development Kit)? JDK je obdobou .Net
SDK, obsahuje základní nástroje nutné pro vývoj aplikací. Nejd íve si ov íme zda máme
JDK nainstalováno. Uložíme-li soubor KvadrRov.java do adresá e ekn me Kvadratice,
je nutno uložit
soubor Solver.java do podadresá e Kvadratice\KvadrRovLib.
KvadrRovLib je název balí ku - package, java alternativ prostoru jmen a jak se zdá Java
pro prostory jmen p ímo používá adresá ový strom.4 Zjistíme si, v kterém adresá i leží
JDK adresá bin a napíšeme si následující dávku (buildjava.bat).
ř
ě
ř
ř
ř
ě
ř
č
ě
ř
ř
ř
ř
set jdkbin=c:\JBuilder9\jdk1.4\bin
cd kvadrrovlib
%jdkbin%\javac.exe solver.java
cd ..
%jdkbin%\javac.exe -classpath . kvadrrov.java
Pokud dávku spustíme, vytvo í se v odpovídajících adresá ích ke každému souboru
*.java soubor *.class obsahující tzv. byte kód (obdoba CIL). Pro spušt ní programu si
napíšeme následující dávku (run.bat)
ř
ř
ě
set jdkbin=c:\JBuilder9\jdk1.4\bin
%jdkbin%\java.exe -classpath . KvadrRov
Prob hne JIT p eklad a JVM (Java Virtual Machine) spustí kód:
ě
ř
Uv domíme si, že v Jav velké množství t íd znamená velké množství *.class soubor
uložených ve stromové adresá ové struktu e5 simulující prostory jmen.
ě
ě
4
ř
Zdrojový soubor *.java nesmí rovn ž obsahovat více než jednu ve ejnou t ídu.
To je d vod, pro se dále balí do *.jar archív .
ř
ě
5
ů
ř
ř
ů
č
ů
ř
11
Knihovnu použijeme pod .Net frameworkem
Nad adresá em Kvadratice nastavíme prost edí SDK (máme zav šeno kafe). Zadáním
p íkazu
ř
ř
ě
ř
vjc /target:library KvadrRovLib/solver.java
vyrobíme p eklada em J# v adresá i KvadrRov assembly solver.dll obsahující ízený kód
se t ídou Solver. Toto assembly m že rozvinout tým VB programátor , který v každé
t íd implementuje metodu about(). Tady je p íslušný kód
č
ř
ř
ř
ř
ů
ř
ů
ě
ř
Imports KvadrRovLib, System
Public Class VBSolver
Inherits Solver
Public Function About() As String
Console.WriteLine("Kvadraticka rovnice:")
End Function
End Class
uložme jej do souboru VBSolver.vb. P íslušné assembly z potomkem VBSolver
p eložíme p eklada em Visual Basicu
ř
ř
ř
č
vbc vbsolver.vb /reference:solver.dll /t:library
kde referencujeme zd d ný kód ze solver.dll. Kone n vše použijeme v C# programu
ě
č
ě
ě
using System;
using KvadrRovLib;
namespace kursyCS
{
class TridniObal
{
static void Main(string[] args)
{
VBSolver sol = new VBSolver();
sol.About();
sol.Solve();
sol.Read();
Console.WriteLine("Reseni:");
sol.Solve();
Console.ReadLine();
}
}
}
Vše p eložíme a sestavíme p íkazem
ř
ř
csc kvadrrov.cs /r:solver.dll /r:vbsolver.dll
12
Vzniklé assembly kvadrrov.exe spustíme obvyklým zp sobem, tady je výsledek
ů
Krom p ísp vku VB týmu (Kvadratická rovnice) vidíme rovn ž, jak .Net na rozdíl od
Javy podporuje automaticky eskou kulturu (desetinná árka).
ě
ř
ě
ě
č
č
Implementace knihovny v MC (Managed C++)
Ano C++ je jedním z jazyk .Netu, dosahuje se toho pomocí tzv. ízených rozší ení
(managed extensions). V našem p ípad je to klí ové slovo __gc p ed slovem class, které
instruuje p eklada k vytvo ení ízené t ídy, jejíž životnost spravuje sb ra odpadk –
Garbage Collector.
ů
ř
ř
ř
č
ř
ř
č
ě
ř
// SolverMC.h
#pragma once
using namespace System;
namespace KvadrRovLib
{
public __gc class Solver
{
private:
double a,b,c;
public:
Solver()
{
Random* rand = new Random();
a = rand->NextDouble();
b = rand->NextDouble();
c = rand->NextDouble();
}
void Read()
ř
ř
ě
č
ů
13
{
a=Read("a:");
b=Read("b:");
c=Read("c:");
}
void Solve()
{
double d = discriminant(a,b,c);
if (d == 0)
{
Console::WriteLine(- b / (2 * a));
return ;
}
if (d > 0)
{
Console::WriteLine((-b+ Math::Sqrt(d))/(2*a));
Console::WriteLine((-b-Math::Sqrt(d))/(2*a));
}
else
{
double x = - b/ (2 * a);
double y = Math::Sqrt(- d) / (2 * a);
Console::WriteLine("{0}+{1}i",__box(x),__box(y));
Console::WriteLine("{0}-{1}i",__box(x),__box(y));
}
}
private:
double Read(String* caption)
{
Console::WriteLine(caption);
return Double::Parse(Console::ReadLine());
}
double discriminant(double a,double b,double c)
{
return b*b-4*a*c;
}
};
}
Implementace knihovny v Ansi/ISO C++
Zde je implementace v C++ podle normy ANSI/ISO, jazyce, který z stal ve Visual
Studiu a s .Netem komunikuje prost ednictvím MC (viz výše). Hlavi kový soubor
solver.h je ten co už byl uveden. Obsahuje p íkaz using namespace std nazna ující
použití standardní knihovny STL, která je sou ástí normy jazyka.
ů
č
ř
ř
č
#include
#include
#include
#include
#include
#include
".\solver.h"
<iostream>
<cmath>
<cstdlib>
<ctime>
<limits>
č
14
namespace KvadrRovLib
{
Solver::Solver(){
srand( (unsigned)time( NULL ) );
double m = (double)numeric_limits<int>::max();
a = rand()/m*1000;
b = rand()/m*1000;
c = rand()/m*1000;
}
void Solver::Read(){
a=Read("a:");
b=Read("b:");
c=Read("c:");
}
void Solver::Solve(){
double d = discriminant(a,b,c);
if (d == 0)
{
cout << - b / (2 * a) << endl;
return;
}
if (d > 0)
{
cout << (- b + sqrt(d)) / (2 * a) << endl;
cout << (- b - sqrt(d)) / (2 * a) << endl;
}
else
{
double r = sqrt(- d) / (2 * a);
cout << - b/ (2 * a) << "+" << r << "i" << endl;
cout << - b/ (2 * a) << "-" << r << "i" << endl;
}
}
double Solver::Read(string caption){
cout << caption << endl;
double r;
cin >> r;
return r;
}
double Solver::discriminant(double a,double b,double c){
return b*b-4*a*c;
}
}
A ješt kód klienta:
ě
#include "./solver.h"
using namespace KvadrRovLib;
int _tmain(int argc, _TCHAR* argv[])
{
Solver* pSolver = new Solver();
15
pSolver->Solve();
pSolver->Read();
pSolver->Solve();
delete pSolver;
return 0;
}
Ješt m žeme vytvo it ízenou obálku (managed wrapper)
Máme-li zajímavý kód v ANSI/ISO C++ a nem žeme-li jej z n jakého d vodu p epsat do
n jakého .Netového jazyka (nejlepší by byl MC), vyrobíme tzv. ízený obal. D vodem
pro nechceme kód p epsat m že být zachování výkonu. MC optimalizuje více než C#,
ale na nativní C++ nemá. Tady vidíme plnou sílu Visual C++. ízený kód je mixován s
ne ízeným. Je vytvo en odkaz na ne ízený objekt pSolver a všechna volání metod jsou
p evedena na n j. Jak vidíme ízená t ída m že mít i destruktor. Trochu si asi budete
muset pohrát s linkerem (smíšený kód v dll), ale zdrojový kód obálky je pr zra ný.
ů
ů
ě
ě
ř
ů
ř
č
ř
ů
Ř
ř
ř
ř
ě
ř
ř
ř
ů
ů
#include ".\solver.h"
using namespace System;
namespace KvadrRovLib
{
public __gc class SolverMC
{
private:
Solver* pSolver;
public:
SolverMC(){pSolver = new Solver();}
~SolverMC(){delete pSolver;}
void Read(){pSolver->Read();}
void Solve(){pSolver->Solve();}
};
}
A pro úplnost kód klienta v C#.
using System;
using KvadrRovLib;
namespace KursCS
{
class TridniObal
{
static void Main()
{
SolverMC solver = new SolverMC();
solver.Solve();
solver.Read();
solver.Solve();
}
}
}
č
16
Assembly je ješt t eba ádn zatemnit
Když se podíváme nástrojem ILDasm na assembly s knihovnou KvadrRovLib, s hr zou
si uv domíme, jak snadné m že být reverzní inženýrství našeho kódu.
ů
ů
ě
Visual Studio 2003 obsahuje zatem ova == obfuscator, komunitní DotFuscator. Po jeho
použití se všechno krásn zatemní. Musíte si ovšem zatemnit všechny assembly aplikace
naráz, jinak si nebudou rozum t. Assembly se p idávají na záložku Trigger Files. Rovn ž
je pot eba nastavit adresá e na záložce Build. DotFuscator najdete v nabídce Visual
Studio .Net Tools (stejn jako shortcut na vsvars32.bat v p edchozí lekci).
ň
č
ě
ě
ř
ř
ě
ř
ě
ř
17

Podobné dokumenty

Nástroje pro vývoj aplikací v závislosti na platformě a jejich vazba na

Nástroje pro vývoj aplikací v závislosti na platformě a jejich vazba na Například diagram nahoře ukazuje zasílání zpráv během přihlašování k webové aplikaci. To, co je zakresleno na tomto diagramu, by šlo vyčíst i ze zdrojového kódu, pokud člověk ovládá programovací ja...

Více

Programovanie 3.

Programovanie 3. Druhá položka (second) vracia true, ak bol vložený nový prvok a false, ak už sa daný prvok v množine nachádza. Prvá položka (first) je iterátor na nový prvok, príp. iterátor na už existujúci prvok ...

Více

Nové prvky v C# 3.0

Nové prvky v C# 3.0 Z tohoto zápisu se zdá, že první zavolání QueryExtensions.Where vyústí v dotaz na databázi, který vyselektuje údaje z tabulky orders, s Londýnem jako místem dodání, a QueryExtensions.SelectMany vyú...

Více

Používáme Visual Studio

Používáme Visual Studio nepoužitelný výpis na konzolu, jak se dotázat na ešení rovnice. Z d vodu jednoduchosti, protože zatím nechceme implementovat t ídu (typ) pro komplexní ísla, nám posta í ešení jako et zec. Existuje ...

Více

INFORMACE PRO UŽIVATELE TARKA 180/2 mg tbl. TARKA 240/4

INFORMACE PRO UŽIVATELE TARKA 180/2 mg tbl. TARKA 240/4 Užíváte-li přípravek Tarka delší dobu, mohou se objevit i jiné nežádoucí účinky, které je nutno oznámit lékaři - například zduření prsou, tvorba mléka nebo obnažení dásní. Hlášení nežádoucích účink...

Více

tutoriál CodeBlocks 10.05 v1.1.cz

tutoriál CodeBlocks 10.05 v1.1.cz 1.8 Pracovní plocha a závislosti projektu V CodeBlocks mohou být otev ené rozli né projekty. Uložením otev ených projekt p es ' File' ' Save workspace' je m žete soust edit v jediné pracovní ploše ...

Více

Visual Basic – základní prvky jazyka

Visual Basic – základní prvky jazyka Psaní na obrazovku Console.WriteLine("text" + "další text" + 123) Tento příkaz napíše to, co je v závorkách, a odřádkuje (tj. přesune se na další řádek). Nechceme-li odřádkovat, použijeme místo Wri...

Více

Návrh malé větrné turbíny

Návrh malé větrné turbíny zajímavější než odporové. Při volbě mezi svislou a horizontální turbínou jsem se po dlouhém zvažování rozhodl pro horizontální, i přestože turbína bude umístěna v zástavbě, kde je turbulentní okolí...

Více