Common Intermediate Language и системное программирование в Microsoft .NET - ответы
Количество вопросов - 537
.class public SampleClass{ .method public static void Demo() { .entrypoint .maxstack 3 ldc.r8 0.0 ldc.r8 0.0 newobj void Point::.ctor(float64,float64) ldc.r8 1.0 ldc.r8 1.0 newobj void Point::.ctor(float64,float64) call float64 Point::Distance(valuetype Point, valuetype Point) call void [mscorlib]System.Console::WriteLine (float64) ret }}метод Demo будет вычислять расстояние между точками:
static double Integrate(Function f, double a, double b, int n){ double h = (b-a)/n, sum = 0.0; for (int i = 0; i < n; i++) sum += h*f.Eval((i+0.5)*h); return sum;}можно объявить тестовый класс TestFunction, реализующий вычисление функции f(x) = x * sin(x) следующим образом:
public abstract class Expression{ public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x);}метод GenerateCIL:
ov.Offset = 12345;ov.hEvent = CreateEvent((LPSECURITY_ATTRIBUTES)NULL, TRUE, FALSE, 0);if ( WriteFile( fh, buffer, sizeof(buffer), &dwWritten, &ov ) || GetLastError() == ERROR_IO_PENDING) { GetOverlappedResult( fh, &ov, &dwWritten, TRUE );} else {}функция GetOverlappedResult проверяет состояние операции и, если она еще не завершена, вызывает функцию:
#include <stdio.h>#include <process.h>#include <windows.h>#define THREADS 10#define ASIZE 10000000static LONG array[ASIZE];unsigned __stdcall ThreadProc( void *param ){ int i; for ( i = 0; i < ASIZE; i++ ) array[i]++; return 0;}int main( void ){ HANDLE hThread[THREADS]; unsigned dwThread; int i, errs; for ( i = 0; i < THREADS; i++ ) hThread[i] = (HANDLE)_beginthreadex( NULL, 0, ThreadProc, NULL, 0, &dwThread ); WaitForMultipleObjects( THREADS, hThread, TRUE, INFINITE ); for ( i = 0; i < THREADS; i++ ) CloseHandle( hThread[i] ); for ( errs=i=0; i<ASIZE; i++ ) if ( array[i] != THREADS ) errs++; if ( errs ) printf("Detected %d errors!\n", errs ); return 0;}несколько потоков увеличивают значение элементов общего массива на:
using VBLib;public class InsertSortedArray: SortedArray{ protected override void Sort() { for (int i = 0; i < Arr.Length-1; i++) { int max = i; for (int j = i+1; j < Arr.Length; j++) if (Arr[j] > Arr[max]) max = j; int tmp = Arr[i]; Arr[i] = Arr[max]; Arr[max] = tmp; } } public InsertSortedArray(int[] A): base(A) { }}переопределяет абстрактный метод:
CoInitialize(NULL);IMetaDataDispenser *dispenser;HRESULT h = CoCreateInstance( CLSID_CorMetaDataDispenser, NULL, CLSCTX_INPROC_SERVER, IID_IMetaDataDispenserEx, (void **)&dispenser );if (h) printf("Error");осуществляется:
public abstract class Expression{ public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x);}метод Evaluate:
ov.Offset = 12345;if ( WriteFile( fh, buffer, sizeof(buffer), &dwWritten, &ov ) || GetLastError() == ERROR_IO_PENDING) { while (!GetOverlappedResult(fh, &ov, &dwWritten, FALSE)){}} else {}Функция GetOverlappedResult проверяет:
DWORD FlsAlloc( PFLS_CALLBACK_FUNCTION lpCallback );VOID WINAPI FlsCallback( PVOID lpFlsData ){ ...}происходит:
class SomeData { [ThreadStatic] public static double xxx; ...поле класса SomeData.xxx будет размещено:
void make_file (FILE* file, PINPUT_PARAMETERS inP){ make_headers (file, inP); make_text_section (file, inP); make_cli_section (file, inP); make_reloc_section (file, inP);};функция make_file вызывает:
public static void ThreadProc(){ int i,j,k, from, to; from = ( m_stripused++ ) * m_stripsize; to = from + m_stripsize; ...с помощью атомарных операций можно переписать так:
BOOL QueueUserWorkItem( LPTHREAD_START_ROUTINE QueryFunction, PVOID pContext, ULONG Flags);предусмотрена возможность:
public abstract class Expression{ public abstract string GenerateCS(); public abstract void GenerateCIL(ILGenerator il); public abstract double Evaluate(double x);}метод GenerateCS:
Default Public ReadOnly Property Array (ByVal Index As Integer) As Integer Get Return Arr(Index) End Get End Property Public ReadOnly Property Count() As Integer Get Return Arr.Length End Get End Propertyдля доступа к отсортированному массиву используются свойства: