增加打包脚本

This commit is contained in:
Tian jianyong 2025-01-03 12:03:50 +08:00
parent 5dd9a70fb4
commit 2b3fcfcf1b
7 changed files with 157 additions and 69 deletions

View File

@ -69,102 +69,56 @@ Console.WriteLine($"大气湍流强度: {turbulence:E2}");
### 项目配置
1. 在 Visual Studio 中创建新的 C++ 项目
2. 将 AirTransmission.dll 复制到项目的输出目录(或可执行文件所在目录)
3. 在代码中使用 LoadLibrary 和 GetProcAddress 动态加载 DLL 函数
2. 将以下文件复制到项目目录:
- `AirTransmission.dll` - 动态链接库文件
- `include/AirTransmission.h` - 头文件
3. 在项目设置中添加 include 目录
4. 在代码中包含头文件并使用导出函数
### 代码示例
```cpp
#include <windows.h>
#include "AirTransmission.h"
#include <iostream>
// 定义函数指针类型
typedef double (__cdecl *CalculateTransmittanceFunc)(
double wavelength,
double distance,
double temperature,
double humidity,
double pressure,
double visibility,
int weatherType
);
typedef double (__cdecl *CalculateAtmosphericTurbulenceFunc)(
double wavelength,
double distance,
double temperature,
double humidity,
double pressure,
double visibility,
int weatherType
);
int main() {
// 加载 DLL
HMODULE hDll = LoadLibrary(L"AirTransmission.dll");
if (hDll == NULL) {
std::cout << "无法加载 DLL" << std::endl;
return 1;
}
// 获取函数地址
auto calculateTransmittance = (CalculateTransmittanceFunc)GetProcAddress(hDll, "CalculateTransmittance");
auto calculateTurbulence = (CalculateAtmosphericTurbulenceFunc)GetProcAddress(hDll, "CalculateAtmosphericTurbulence");
if (calculateTransmittance == NULL || calculateTurbulence == NULL) {
std::cout << "无法获取函数地址" << std::endl;
FreeLibrary(hDll);
return 1;
}
// 设置参数
double wavelength = 1.064; // 波长(微米)
double distance = 1000.0; // 距离(米)
double temperature = 20.0; // 温度(摄氏度)
double humidity = 0.65; // 相对湿度0-1
double relativeHumidity = 0.65; // 相对湿度0-1
double pressure = 101.325; // 大气压力kPa
double visibility = 10000.0; // 能见度(米)
int weatherType = 0; // 天气类型0=晴天)
int weatherType = WeatherType::Clear; // 天气类型(晴天)
// 计算透过率
double transmittance = calculateTransmittance(
wavelength, distance, temperature, humidity,
double transmittance = CalculateTransmittance(
wavelength, distance, temperature, relativeHumidity,
pressure, visibility, weatherType
);
std::cout << "透过率: " << transmittance * 100.0 << "%" << std::endl;
// 计算湍流影响
double turbulence = calculateTurbulence(
wavelength, distance, temperature, humidity,
double turbulence = CalculateAtmosphericTurbulence(
wavelength, distance, temperature, relativeHumidity,
pressure, visibility, weatherType
);
std::cout << "湍流强度: " << turbulence << std::endl;
// 卸载 DLL
FreeLibrary(hDll);
return 0;
}
```
## 注意事项
### 注意事项
1. 所有浮点数输入都使用 double 类型
2. 波长单位为微米μm
3. 距离单位为米m
4. 温度单位为摄氏度(℃)
5. 压力单位为千帕kPa
6. 相对湿度范围为 0-1
7. 确保输入参数在合理范围内:
- 波长0.2-20 μm
- 距离:> 0 m
- 温度:-40 到 +60 ℃
1. 确保 AirTransmission.dll 在程序运行目录下
2. 头文件中已定义了所有必要的类型和函数
3. 使用 WeatherType 枚举来指定天气类型
4. 所有浮点数参数都使用 double 类型
5. 参数单位说明:
- 波长微米μm
- 距离m
- 温度:摄氏度(℃)
- 相对湿度0-1
- 压力80-120 kPa
8. C++ 调用注意事项:
- 确保 DLL 文件在正确的路径下
- 所有导出函数使用 __cdecl 调用约定
- 处理好错误情况DLL 加载失败、函数获取失败等)
- 天气类型枚举值:
- 0 = 晴天 (Clear)
- 1 = 多云 (Cloudy)
- 2 = 雨天 (Rain)
- 压力千帕kPa
- 能见度m

64
include/AirTransmission.h Normal file
View File

@ -0,0 +1,64 @@
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
// 天气类型枚举
enum WeatherType {
Clear = 0, // 晴天
Cloudy = 1, // 多云
Rain = 2, // 雨天
Fog = 3, // 雾天
Dust = 4, // 沙尘
Snow = 5 // 雪天
};
// 导出函数声明
#ifdef _WIN32
#define DLLEXPORT __declspec(dllimport)
#else
#define DLLEXPORT
#endif
/// @brief 计算大气透过率
/// @param wavelength 波长(微米)
/// @param distance 距离(米)
/// @param temperature 温度(摄氏度)
/// @param relativeHumidity 相对湿度0-1
/// @param pressure 大气压力kPa
/// @param visibility 能见度(米)
/// @param weatherType 天气类型(参见 WeatherType 枚举)
/// @return 大气透过率0-1
DLLEXPORT double __cdecl CalculateTransmittance(
double wavelength,
double distance,
double temperature,
double relativeHumidity,
double pressure,
double visibility,
int weatherType
);
/// @brief 计算大气湍流影响
/// @param wavelength 波长(微米)
/// @param distance 距离(米)
/// @param temperature 温度(摄氏度)
/// @param relativeHumidity 相对湿度0-1
/// @param pressure 大气压力kPa
/// @param visibility 能见度(米)
/// @param weatherType 天气类型(参见 WeatherType 枚举)
/// @return 湍流影响系数0-1
DLLEXPORT double __cdecl CalculateAtmosphericTurbulence(
double wavelength,
double distance,
double temperature,
double relativeHumidity,
double pressure,
double visibility,
int weatherType
);
#ifdef __cplusplus
}
#endif

Binary file not shown.

Binary file not shown.

Binary file not shown.

70
scripts/pack_release.sh Executable file
View File

@ -0,0 +1,70 @@
#!/bin/bash
# 版本号
VERSION="1.0.0"
PACKAGE_NAME="AirTransmissionLibrary-${VERSION}"
# 创建临时目录和发布目录
rm -rf temp publish
mkdir -p temp/${PACKAGE_NAME}/{lib,include,doc}
mkdir -p publish
# 编译项目
echo "Building project..."
dotnet build src/AirTransmission/AirTransmission.csproj -c Release
# 复制必要文件
echo "Copying files..."
cp src/AirTransmission/bin/Release/net8.0/AirTransmission.dll temp/${PACKAGE_NAME}/lib/
cp src/AirTransmission/bin/Release/net8.0/AirTransmission.xml temp/${PACKAGE_NAME}/lib/
cp include/AirTransmission.h temp/${PACKAGE_NAME}/include/
# 生成文档
echo "Generating documentation..."
docfx metadata docfx.json
docfx build docfx.json
wkhtmltopdf --enable-local-file-access \
--page-size A4 \
--margin-top 20 \
--margin-bottom 20 \
--margin-left 20 \
--margin-right 20 \
--footer-left "大气传输计算库 API 文档" \
--footer-right "[page]/[topage]" \
--footer-spacing 8 \
--user-style-sheet docs/custom.css \
_site/docs/introduction.html \
_site/docs/API.html \
_site/api/AirTransmission.AtmosphericTransmittanceCalculator.html \
_site/api/AirTransmission.WeatherCondition.html \
_site/api/AirTransmission.WeatherType.html \
_site/docs/usage_examples.html \
temp/${PACKAGE_NAME}/doc/AirTransmission-API-Doc.pdf
# 创建 README
cat > temp/${PACKAGE_NAME}/README.txt << EOL
大气传输计算库 v${VERSION}
目录结构:
lib/ - 库文件
AirTransmission.dll - 主库文件
AirTransmission.xml - API 文档(用于 IDE 智能提示)
include/ - 头文件
AirTransmission.h - C++ 头文件
doc/ - 文档
AirTransmission-API-Doc.pdf - API 文档
使用说明请参考 doc/AirTransmission-API-Doc.pdf
EOL
# 打包
echo "Creating package..."
cd temp
zip -r ../publish/${PACKAGE_NAME}.zip ${PACKAGE_NAME}
cd ..
# 清理临时文件
echo "Cleaning up..."
rm -rf temp
echo "Package created at publish/${PACKAGE_NAME}.zip"