...

Net com что это за программа

Пример COM-взаимодействия. Клиент .NET и COM-сервер

В этом примере демонстрируется, как клиент .NET, построенный для доступа к COM-серверу, создает экземпляр кокласса COM и вызывает члены класса для расчета выплат по ипотечному кредиту.

В этом примере клиент создает и вызывает экземпляр кокласса Loan, передает в экземпляр четыре аргумента (один из этих аргументов равен нулю) и отображает результаты вычислений. Фрагменты кода из этого образца используются в рамках всего этого раздела.

Клиент .NET

Imports System Imports Microsoft.VisualBasic Imports LoanLib Public Class LoanApp Public Shared Sub Main() Dim Args As String() Args = System.Environment.GetCommandLineArgs() Dim ln As New Loan() If Args.Length < 5 Then Console.WriteLine("Usage: ConLoan Balance Rate Term Payment") Console.WriteLine(" Either Balance, Rate, Term, or Payment " _ & "must be 0") Exit Sub End If ln.OpeningBalance = Convert.ToDouble(Args(1)) ln.Rate = Convert.ToDouble(Args(2)) / 100.0 ln.Term = Convert.ToInt16(Args(3)) ln.Payment = Convert.ToDouble(Args(4)) If ln.OpeningBalance = 0.0 Then ln.ComputeOpeningBalance() End If If ln.Rate = 0.0 Then ln.ComputeRate() End If If ln.Term = 0 Then ln.ComputeTerm() End If If ln.Payment = 0.0 Then ln.ComputePayment() End If Console.WriteLine("Balance = ", ln.OpeningBalance) Console.WriteLine("Rate = ", ln.Rate) Console.WriteLine("Term = ", ln.Term) Console.WriteLine("Payment = " & ControlChars.Cr, _ ln.Payment) Dim MorePmts As Boolean Dim Balance As Double = 0.0 Dim Principal As Double = 0.0 Dim Interest As Double = 0.0 Console.WriteLine("", _ "Nbr", "Payment", "Principal", "Interest", "Balance") Console.WriteLine("", _ "---", "-------", "---------", "--------", "-------") MorePmts = ln.GetFirstPmtDistribution(ln.Payment, Balance, _ Principal, Interest) Dim PmtNbr As Short While MorePmts Console.WriteLine("" _ & "", PmtNbr, ln.Payment, Principal, Interest, Balance) MorePmts = ln.GetNextPmtDistribution(ln.Payment, Balance, _ Principal, Interest) PmtNbr += CShort(1) End While End Sub End Class 
using System; using LoanLib; public class LoanApp < public static void Main(String[] Args) < Loan ln = new Loan(); if (Args.Length < 4) < Console.WriteLine("Usage: ConLoan Balance Rate Term Payment"); Console.WriteLine(" Either Balance, Rate, Term, or Payment must be 0"); return; >ln.OpeningBalance = Convert.ToDouble(Args[0]); ln.Rate = Convert.ToDouble(Args[1])/100.0; ln.Term = Convert.ToInt16(Args[2]); ln.Payment = Convert.ToDouble(Args[3]); if (ln.OpeningBalance == 0.00) ln.ComputeOpeningBalance(); if (ln.Rate == 0.00) ln.ComputeRate(); if (ln.Term == 0) ln.ComputeTerm(); if (ln.Payment == 0.00) ln.ComputePayment(); Console.WriteLine("Balance = ", ln.OpeningBalance); Console.WriteLine("Rate = ", ln.Rate); Console.WriteLine("Term = ", ln.Term); Console.WriteLine("Payment = \n", ln.Payment); bool MorePmts; double Balance = 0.0; double Principal = 0.0; double Interest = 0.0; Console.WriteLine("", "Nbr", "Payment", "Principal", "Interest", "Balance"); Console.WriteLine("", "---", "-------", "---------", "--------", "-------"); MorePmts = ln.GetFirstPmtDistribution(ln.Payment, out Balance, out Principal, out Interest); for (short PmtNbr = 1; MorePmts; PmtNbr++) < Console.WriteLine(" ", PmtNbr, ln.Payment, Principal, Interest, Balance); MorePmts = ln.GetNextPmtDistribution(ln.Payment, ref Balance, out Principal, out Interest); > > > 

COM-сервер

// Loan.cpp : Implementation of CLoan #include "stdafx.h" #include "math.h" #include "LoanLib.h" #include "Loan.h" static double Round(double value, short digits); STDMETHODIMP CLoan::get_OpeningBalance(double *pVal) < *pVal = OpeningBalance; return S_OK; >STDMETHODIMP CLoan::put_OpeningBalance(double newVal) < OpeningBalance = newVal; return S_OK; >STDMETHODIMP CLoan::get_Rate(double *pVal) < *pVal = Rate; return S_OK; >STDMETHODIMP CLoan::put_Rate(double newVal) < Rate = newVal; return S_OK; >STDMETHODIMP CLoan::get_Payment(double *pVal) < *pVal = Payment; return S_OK; >STDMETHODIMP CLoan::put_Payment(double newVal) < Payment = newVal; return S_OK; >STDMETHODIMP CLoan::get_Term(short *pVal) < *pVal = Term; return S_OK; >STDMETHODIMP CLoan::put_Term(short newVal) < Term = newVal; return S_OK; >STDMETHODIMP CLoan::ComputePayment(double *pVal) < Payment = Round(OpeningBalance * (Rate / (1 - pow((1 + Rate), -Term))),2); *pVal = Payment; return S_OK; >STDMETHODIMP CLoan::ComputeOpeningBalance(double *pVal) < OpeningBalance = Round(Payment / (Rate / (1 - pow((1 + Rate), -Term))),2); *pVal = OpeningBalance ; return S_OK; >STDMETHODIMP CLoan::ComputeRate(double *pVal) < double DesiredPayment = Payment; for (Rate = 0.001; Rate < 28.0; Rate += 0.001) < Payment = Round(OpeningBalance * (Rate / (1 - pow((1 + Rate), -Term))),2); if (Payment >= DesiredPayment) break; > *pVal = Rate; return S_OK; > STDMETHODIMP CLoan::ComputeTerm(short *pVal) < double DesiredPayment = Payment; for (Term = 1; Term < 480 ; Term ++) < Payment = Round(OpeningBalance * (Rate / (1 - pow((1 + Rate), -Term))),2); if (Payment *pVal = Term; return S_OK; > STDMETHODIMP CLoan::GetFirstPmtDistribution(double PmtAmt, double *Balance, double *PrinPortion, double *IntPortion, VARIANT_BOOL *pVal) < *Balance = OpeningBalance; GetNextPmtDistribution(PmtAmt, Balance, PrinPortion, IntPortion, pVal); return S_OK; >STDMETHODIMP CLoan::GetNextPmtDistribution(double PmtAmt, double *Balance, double *PrinPortion, double *IntPortion, VARIANT_BOOL *pVal) < *IntPortion = Round(*Balance * Rate, 2); *PrinPortion = Round(PmtAmt - *IntPortion, 2); *Balance = Round(*Balance - *PrinPortion, 2); if (*Balance STDMETHODIMP CLoan::get_RiskRating(BSTR *pVal) < *pVal = (BSTR)RiskRating; return S_OK; >STDMETHODIMP CLoan::put_RiskRating(BSTR newVal) < RiskRating = newVal; return S_OK; >static double Round(double value, short digits) < double factor = pow(10, digits); return floor(value * factor + 0.5)/factor; >

См. также

Предоставление доступа к компонентам .NET для COM

Написание типа .NET и его использование из неуправляемого кода — это разные операции с точки зрения разработчика. В этом разделе приводятся советы по написанию управляемого кода, который взаимодействует с клиентами COM:

  • Уточнение типов .NET для взаимодействия. Все управляемые типы, методы, свойства, поля и события, которые требуется предоставить модели COM, должны быть открытыми. Типы должны иметь открытый конструктор без параметров, который является единственным конструктором, доступным для вызова из модели COM.
  • Применение атрибутов взаимодействия. С помощью настраиваемых атрибутов в управляемом коде можно расширять возможности взаимодействия для компонента.
  • Упаковка сборки для модели COM. Разработчикам COM-приложений могут потребоваться общие сведения о шагах, которые необходимо выполнить для развертывания ваших сборок и использования ссылок на них.

Кроме того, в этом разделе описываются задачи, связанные с использованием управляемого типа из клиента COM.

Использование управляемого типа из модели COM

  1. Регистрация сборок в COM. Типы в сборке и библиотеке типов необходимо регистрировать во время разработки. Если установщик не регистрирует сборку, необходимо предоставить разработчикам COM-приложений инструкции по использованию программы Regasm.exe.
  2. Создание ссылки на типы .NET из COM. Разработчики COM-приложений могут использовать доступные средства и методы для ссылки на типы в сборке.
  3. Вызов объекта .NET. Разработчики COM-приложений могут вызывать методы для объектов .NET так же, как и методы для любого неуправляемого типа. Например, API CoCreateInstance модели COM активирует объекты .NET.
  4. Развертывание приложения для доступа к COM-приложению. Сборки со строгими именами могут устанавливаться в глобальный кэш сборок и должны быть подписаны их издателем. Сборки, которые не имеют строгих имен, должны устанавливаться в каталог приложения клиента.

См. также

  • Взаимодействие с неуправляемым кодом
  • Пример COM-взаимодействия. COM-клиент и сервер .NET

Оболочки COM

Модель COM имеет несколько важных отличий от объектной модели среды выполнения .NET:

  • Клиенты COM-объектов должны управлять временем существования этих объектов. В общеязыковой среде выполнения управление временем существования объектов осуществляет сама среда.
  • Клиенты COM-объектов определяют доступность службы, запрашивая интерфейс, который ее предоставляет, в результате чего возвращается или не возвращается указатель на интерфейс. Клиенты объектов .NET могут получать описание функциональных возможностей объекта с помощью отражения.
  • Объекты .NET располагаются в памяти под управлением среды выполнения .NET. Среда выполнения может перемещать объекты в памяти в целях оптимизации производительности и обновлять все ссылки на перемещаемые объекты. Неуправляемые клиенты после получения указателя на объект работают с объектом, находящимся в указанном расположении. У этих клиентов отсутствуют механизмы для работы с объектами, не имеющими фиксированного расположения.

Чтобы обойти эти различия, среда выполнения предоставляет классы-оболочки, которые моделируют вызов объектов в соответствующих им средах для управляемых и неуправляемых клиентов. Каждый раз, когда управляемый клиент вызывает метод для COM-объекта, среда выполнения создает вызываемую оболочку времени выполнения (RCW). Помимо прочего, вызываемая оболочка времени выполнения позволяет абстрагировать различия между управляемыми и неуправляемыми механизмами ссылок. Среда выполнения также создает вызываемую оболочку COM (CCW) для работы в обратном направлении, когда COM-клиенту требуется вызвать метод для объекта .NET. Как показано на следующем рисунке, класс-оболочка, который создается средой выполнения, зависит от контекста вызывающего кода.

В большинстве случаев стандартный RCW или CCW, создаваемый средой выполнения, обеспечивает адекватное маршалирование для вызовов, которые пересекают границу между COM и средой выполнения .NET. С помощью настраиваемых атрибутов при необходимости можно определить способ представления управляемого и неуправляемого кода в среде выполнения.

См. также

  • Расширенное COM-взаимодействие в .NET Framework
  • Вызываемая оболочка времени выполнения
  • Вызываемая оболочка COM
  • Настройка стандартных оболочек в платформе .NET Framework
  • Практическое руководство. Настройка вызываемых оболочек времени выполнения в платформе .NET Framework

При подготовке материала использовались источники:
https://learn.microsoft.com/ru-ru/dotnet/framework/interop/com-interop-sample-net-client-and-com-server
https://learn.microsoft.com/ru-ru/dotnet/framework/interop/exposing-dotnet-components-to-com
https://learn.microsoft.com/ru-ru/dotnet/standard/native-interop/com-wrappers

Оцените статью