naecotor Ответов: 2

Использование собственных заголовков в проекте C#


Всем привет,

Вот мой вопрос. У меня есть собственный проект со многими заголовками и классами, которые я пытаюсь обернуть с помощью c++/cli, чтобы иметь dll, на которую я мог бы ссылаться в своем проекте c#.

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

Когда у меня есть заголовок и соответствующий класс, я могу обернуть это. Но когда у меня есть только заголовок с несколькими функциями, я не знаю, как их обернуть.

Как можно обернуть эти заголовочные файлы ?

P. S : Вот пример заголовков, которые я пытаюсь обернуть в C++/CLI

#ifndef ASSIM_H
#define ASSIM_H

#include "et.h"

// Changes the given model parameter based on current temperature.
//   k25 (model parameter at 25 deg. C), q10 (Q10 value),
//   lftemp (leaf temperature, deg. C)
double Q10(double k25, double q10, double lftemp)
{
   return (k25 * pow(q10, (lftemp - 25.0) / 10.0));
}

// Rubisco capacity rate (umol m-2 s-1)
//   lftemp (leaf temperature, deg. C)
double Vcmax(double lftemp)
{
   double const VCMAX = 200.0;   // max rate
   double dExp = 1.0 + exp(0.128 * (lftemp - 40.0));
   return (Q10(VCMAX, 2.4, lftemp) / dExp);
}

// CO2 compensation point (umol mol-1)
//   lftemp (leaf temperature, deg. C)
double CO2CompensationPt(double lftemp)
{
   double const TAU = 2600.0;    // specificity factor
   double const OA = 210000.0;   // O2 concentration
   double dTau = Q10(TAU, 0.57, lftemp);
   return (OA * 0.5 / dTau);
}


Что я уже пробовал:

Я пытаюсь создать класс ref для инкапсуляции этих функций/заголовков, но мне нужно использовать указатель на собственный класс, но дело в том, что это не класс, а только список функций, выполняющих вычисления.

0x01AA

Я никогда не использовал его, но, возможно, он может помочь вам: PInvoker-C#/VB.NET инструменты генерации интерфейса PInvoke[^]

2 Ответов

Рейтинг:
1

naecotor

Привет Карстенк,

Спасибо за ваш ответ. Моя идея состоит в том, чтобы построить оболочку C++/CLI. Несколько часов назад я попробовал кое-что, что, кажется, работает без необходимости переписывать все объявления в c#.
Вот "возможное" решение, которое я написал (Я не знаю, правильно ли оно).
Итак, я сделал следующее :

Для моего собственного заголовка (assim. h) , который находится в моем первом сообщении, я определил класс c++/cli с помощью :

1) assimWrapper. h

// PaSimWrapper.h
#pragma once

#include "Stdafx.h"

namespace Wrapper{
	
	public ref class assimWrapper
	{
	public:
		double Q10Wrapped(double k25, double q10, double leafTemp);
		double CO2CompensationPtWrapped(double leafTemp);
		double VcmaxWrapped(double leafTemp);
		double LightLimitedWrapped(double par, double leafTemp, double ci);
		double RubiscoLimitedWrapped(double leafTemp, double ci);
		double SinkLimitedWrapped(double leafTemp);
		double LeafAssimWrapped(double par, double leafTemp);
		double HourCanopyAssimWrapped(double th, double leafTemp);
		double DayCanopyAssimWrapped();

	};
}


2) assimWrapper.cpp

#include "Stdafx.h"
//#include "etWrapper.h"

#include "assim.h"
#include "assimWrapper.h"

namespace Wrapper
{
	///
	///
	double assimWrapper::Q10Wrapped(double k25, double q10, double leafTemp)
	{
		return Q10(k25, q10, leafTemp);
	}

	///
	///
	double assimWrapper::CO2CompensationPtWrapped(double leafTemp)
	{
		return CO2CompensationPt(leafTemp);
	}

	///
	///
	double assimWrapper::VcmaxWrapped(double leafTemp)
	{
		return Vcmax(leafTemp);
	}

	///
	///
	double assimWrapper::LightLimitedWrapped(double par, double leafTemp, double ci)
	{
		return LightLimited(par, leafTemp, ci);
	}

	///
	///
	double assimWrapper::RubiscoLimitedWrapped(double leafTemp, double ci)
	{
		return RubiscoLimited(leafTemp, ci);
	}

	///
	///
	double assimWrapper::SinkLimitedWrapped(double leafTemp)
	{
		return SinkLimited(leafTemp);
	}

	///
	///
	double assimWrapper::LeafAssimWrapped(double par, double leafTemp)
	{
		return LeafAssim(par, leafTemp);
	}

	///
	///
	double assimWrapper::HourCanopyAssimWrapped(double th, double leafTemp)
	{
		return HourCanopyAssimWrapped(th, leafTemp);
	}

	///
	///
	double assimWrapper::DayCanopyAssimWrapped()
	{
		return DayCanopyAssim();
	}
};


Кажется, это работает, потому что у меня есть доступ к моим родным функциям в моем проекте c#.

Считаете ли вы или другие люди, что это правильно ?

SD


Matt T Heffron

Вы не должны публиковать решение, чтобы ответить на комментарий.
Вы должны использовать функцию "есть вопрос или комментарий?" кнопка для основных комментариев.
Таким образом, человек, которому вы отвечаете, получает уведомление по электронной почте о вашем комментарии.
(Комментарии не допускают разметки кода.)

Если вы хотите добавить что-то более существенное, например пояснительный код, то используйте "улучшить вопрос", который находится в нижней части вашего первоначального вопроса. Оставьте исходный вопрос нетронутым, но добавьте дополнение(ы) ниже.

[no name]

Это решение выглядит хорошо для меня. Он имеет возможность статического связывания кода C с вашей сборкой C++/CLI , что делает его лучше, чем решение Карстенка.

Рейтинг:
0

KarstenK

Вы не можете избежать работы по написанию всех объявлений в C#. Взгляните на мою статью Вызов всех станций.

Дело в том, чтобы объявить функции C как недекорированные.


naecotor

Привет карстенк,

Спасибо за ваш ответ. Моя идея состоит в том, чтобы построить оболочку C++/CLI. Несколько часов назад я попробовал кое-что, что, кажется, работает без необходимости переписывать все объявления в c#.
Вот "возможное" решение, которое я написал (Я не знаю, правильно ли оно).
Итак, в предлагаемом мною решении я сделал следующее. Кажется, я ошибся в ответе на ваш комментарий.

SD