增加了 C++ 原生接口
This commit is contained in:
parent
a8467d9e6b
commit
e5dcf17224
158
README.md
Normal file
158
README.md
Normal file
@ -0,0 +1,158 @@
|
||||
# ThreatSource Library
|
||||
|
||||
威胁源仿真库是一个用于模拟和仿真各种威胁源的.NET类库。提供 .NET 和原生 C++ 两种接口。
|
||||
|
||||
## 编译和打包
|
||||
|
||||
### 编译 .NET 库
|
||||
|
||||
编译 Debug 版本:
|
||||
|
||||
```bash
|
||||
dotnet build ThreatSource/ThreatSource.csproj
|
||||
```
|
||||
|
||||
编译 Release 版本:
|
||||
|
||||
```bash
|
||||
dotnet build ThreatSource/ThreatSource.csproj -c Release
|
||||
```
|
||||
|
||||
### 编译原生库
|
||||
|
||||
1. 使用 Visual Studio 2022 打开 ThreatSourceNative/ThreatSourceNative.vcxproj
|
||||
2. 选择配置:Release,平台:x64
|
||||
3. 编译解决方案
|
||||
|
||||
### 打包
|
||||
|
||||
#### 打包 .NET 库
|
||||
|
||||
使用打包脚本生成 zip 包:
|
||||
|
||||
```bash
|
||||
./scripts/pack_dll.sh
|
||||
```
|
||||
|
||||
生成的文件位于 `publish` 目录下,文件名格式为 `ThreatSourceLibrary-{version}.zip`。
|
||||
包含以下文件:
|
||||
|
||||
- ThreatSource.dll - 主要的库文件
|
||||
- ThreatSource.deps.json - 依赖配置文件
|
||||
- ThreatSource.xml - API 文档文件
|
||||
|
||||
#### 打包原生库
|
||||
|
||||
使用打包脚本生成 zip 包:
|
||||
|
||||
```bash
|
||||
./scripts/pack_native.sh
|
||||
```
|
||||
|
||||
生成的文件位于 `publish` 目录下,文件名格式为 `ThreatSourceNative-{version}.zip`。
|
||||
包含以下文件:
|
||||
|
||||
- bin/ThreatSourceNative.dll - 原生接口库
|
||||
- bin/ThreatSource.dll - 核心库
|
||||
- bin/ThreatSource.deps.json - 依赖配置文件
|
||||
- include/threat_source.h - C接口头文件
|
||||
|
||||
### 生成文档
|
||||
|
||||
生成 PDF 格式的文档:
|
||||
|
||||
```bash
|
||||
# 先生成 HTML 文档
|
||||
docfx build docfx.json
|
||||
|
||||
# 然后生成 PDF
|
||||
./scripts/generate_pdf.sh
|
||||
```
|
||||
|
||||
生成的 PDF 文件位于 `publish` 目录下,文件名为 `ThreatSource-Library.pdf`。
|
||||
|
||||
## 项目结构
|
||||
|
||||
```text
|
||||
ThreatSource/
|
||||
├── src/
|
||||
│ ├── Target/
|
||||
│ │ └── Tank.cs
|
||||
│ ├── Indicator/
|
||||
│ │ ├── LaserDesignator.cs
|
||||
│ │ ├── LaserBeamRider.cs
|
||||
│ │ └── InfraredTracker.cs
|
||||
│ └── Missile/
|
||||
│ ├── BaseMissile.cs
|
||||
│ ├── LaserBeamRiderMissile.cs
|
||||
│ ├── InfraredCommandGuidedMissile.cs
|
||||
│ ├── LaserSemiActiveGuidedMissile.cs
|
||||
│ ├── InfraredImagingTerminalGuidedMissile.cs
|
||||
│ ├── MillimeterWaveTerminalGuidedMissile.cs
|
||||
│ ├── TerminalSensitiveMissile.cs
|
||||
│ └── TerminalSensitiveSubmunition.cs
|
||||
├── docs/ - 文档目录
|
||||
├── ThreatSourceNative/ - 原生接口库
|
||||
│ ├── include/
|
||||
│ │ └── threat_source.h - C接口头文件
|
||||
│ └── src/
|
||||
│ └── threat_source.cpp - C接口实现
|
||||
└── scripts/ - 工具脚本目录
|
||||
├── pack_dll.sh - .NET库打包脚本
|
||||
├── pack_native.sh - 原生库打包脚本
|
||||
└── generate_pdf.sh - PDF生成脚本
|
||||
```
|
||||
|
||||
## 开发环境要求
|
||||
|
||||
- .NET 8.0 或更高版本
|
||||
- Visual Studio 2022 或更高版本
|
||||
- DocFX(用于生成文档)
|
||||
- wkhtmltopdf(用于生成 PDF)
|
||||
|
||||
## 使用说明
|
||||
|
||||
### C#/.NET 用户
|
||||
|
||||
1. 通过 NuGet 包管理器安装:
|
||||
|
||||
```bash
|
||||
dotnet add package ThreatSource
|
||||
```
|
||||
|
||||
2. 或直接引用 DLL 文件:
|
||||
- 下载最新的 zip 包
|
||||
- 解压并引用 ThreatSource.dll
|
||||
|
||||
### C++用户
|
||||
|
||||
有两种使用方式:
|
||||
|
||||
#### 方式一:动态加载(推荐)
|
||||
|
||||
1. 下载 ThreatSourceNative 包
|
||||
2. 将 bin 目录下的所有 DLL 复制到程序目录
|
||||
3. 将 include/threat_source.h 添加到项目
|
||||
4. 使用 C 风格接口调用库功能
|
||||
|
||||
#### 方式二:CLR 集成
|
||||
|
||||
如果需要使用 .NET 的完整功能:
|
||||
|
||||
1. 配置项目属性:
|
||||
- C/C++ -> 常规 -> 公共语言运行时支持:/clr
|
||||
- 常规 -> 平台工具集:Visual Studio 2022 (v143)
|
||||
- 常规 -> .NET目标框架:net8.0
|
||||
|
||||
2. 引用 ThreatSource.dll
|
||||
|
||||
## 示例代码
|
||||
|
||||
请参考 [docs/examples](docs/examples) 目录下的示例代码:
|
||||
|
||||
- [集成示例](docs/examples/Integration/README.md)
|
||||
- [仿真示例](docs/examples/Simulation/README.md)
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
@ -4,6 +4,12 @@
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<Version>1.0.0</Version>
|
||||
<Product>ThreatSource Library</Product>
|
||||
<Description>A comprehensive library for missile simulation and threat source modeling.</Description>
|
||||
<Copyright>Copyright © 2024</Copyright>
|
||||
<GenerateDocumentationFile>true</GenerateDocumentationFile>
|
||||
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
65
ThreatSourceNative/ThreatSourceNative.vcxproj
Normal file
65
ThreatSourceNative/ThreatSourceNative.vcxproj
Normal file
@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup Label="ProjectConfigurations">
|
||||
<ProjectConfiguration Include="Debug|x64">
|
||||
<Configuration>Debug</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
<ProjectConfiguration Include="Release|x64">
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<ProjectGuid>{12345678-1234-1234-1234-123456789ABC}</ProjectGuid>
|
||||
<Keyword>Win32Proj</Keyword>
|
||||
<RootNamespace>ThreatSourceNative</RootNamespace>
|
||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||
|
||||
<PropertyGroup Label="Configuration">
|
||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<CLRSupport>true</CLRSupport>
|
||||
</PropertyGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
|
||||
<PropertyGroup>
|
||||
<OutDir>$(SolutionDir)bin\$(Platform)\$(Configuration)\</OutDir>
|
||||
<IntDir>$(SolutionDir)obj\$(Platform)\$(Configuration)\</IntDir>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemDefinitionGroup>
|
||||
<ClCompile>
|
||||
<WarningLevel>Level3</WarningLevel>
|
||||
<PreprocessorDefinitions>THREATSOURCE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<AdditionalIncludeDirectories>$(ProjectDir)include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Windows</SubSystem>
|
||||
<AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ClInclude Include="include\threat_source.h" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\threat_source.cpp" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Reference Include="ThreatSource">
|
||||
<HintPath>..\ThreatSource\bin\$(Configuration)\net8.0\ThreatSource.dll</HintPath>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
</Project>
|
||||
70
ThreatSourceNative/include/threat_source.h
Normal file
70
ThreatSourceNative/include/threat_source.h
Normal file
@ -0,0 +1,70 @@
|
||||
#ifndef THREAT_SOURCE_H
|
||||
#define THREAT_SOURCE_H
|
||||
|
||||
#ifdef _WIN32
|
||||
#ifdef THREATSOURCE_EXPORTS
|
||||
#define THREATSOURCE_API __declspec(dllexport)
|
||||
#else
|
||||
#define THREATSOURCE_API __declspec(dllimport)
|
||||
#endif
|
||||
#else
|
||||
#define THREATSOURCE_API
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// 错误码定义
|
||||
#define THREATSOURCE_SUCCESS 0
|
||||
#define THREATSOURCE_ERROR_INVALID_PARAM -1
|
||||
#define THREATSOURCE_ERROR_INIT_FAILED -2
|
||||
#define THREATSOURCE_ERROR_SIMULATION_FAILED -3
|
||||
|
||||
// 仿真管理
|
||||
THREATSOURCE_API int TS_CreateSimulation();
|
||||
THREATSOURCE_API int TS_DestroySimulation();
|
||||
|
||||
// 导弹相关
|
||||
THREATSOURCE_API int TS_CreateMissile(
|
||||
const char* id,
|
||||
double x, double y, double z, // 初始位置
|
||||
double vx, double vy, double vz, // 初始速度
|
||||
double max_speed, // 最大速度
|
||||
double max_acceleration, // 最大加速度
|
||||
double max_flight_time, // 最大飞行时间
|
||||
double max_flight_distance, // 最大飞行距离
|
||||
double mass // 质量
|
||||
);
|
||||
|
||||
THREATSOURCE_API int TS_ActivateMissile(const char* id);
|
||||
THREATSOURCE_API int TS_DeactivateMissile(const char* id);
|
||||
THREATSOURCE_API int TS_FireMissile(const char* id);
|
||||
THREATSOURCE_API int TS_GetMissilePosition(const char* id, double* x, double* y, double* z);
|
||||
THREATSOURCE_API int TS_GetMissileVelocity(const char* id, double* vx, double* vy, double* vz);
|
||||
THREATSOURCE_API int TS_IsMissileActive(const char* id, int* active);
|
||||
|
||||
// 目标相关
|
||||
THREATSOURCE_API int TS_CreateTarget(
|
||||
const char* id,
|
||||
double x, double y, double z, // 位置
|
||||
double orientation // 朝向(弧度)
|
||||
);
|
||||
|
||||
THREATSOURCE_API int TS_ActivateTarget(const char* id);
|
||||
THREATSOURCE_API int TS_DeactivateTarget(const char* id);
|
||||
THREATSOURCE_API int TS_GetTargetPosition(const char* id, double* x, double* y, double* z);
|
||||
THREATSOURCE_API int TS_GetTargetOrientation(const char* id, double* orientation);
|
||||
|
||||
// 仿真控制
|
||||
THREATSOURCE_API int TS_UpdateSimulation(double deltaTime);
|
||||
THREATSOURCE_API int TS_GetSimulationTime(double* time);
|
||||
|
||||
// 事件查询
|
||||
THREATSOURCE_API int TS_GetLastError(char* buffer, int buffer_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // THREAT_SOURCE_H
|
||||
190
ThreatSourceNative/src/threat_source.cpp
Normal file
190
ThreatSourceNative/src/threat_source.cpp
Normal file
@ -0,0 +1,190 @@
|
||||
#include "../include/threat_source.h"
|
||||
#include <msclr/auto_gcroot.h>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vcclr.h>
|
||||
|
||||
using namespace System;
|
||||
using namespace ThreatSource::Simulation;
|
||||
|
||||
// 全局变量
|
||||
static msclr::auto_gcroot<SimulationManager^> g_manager;
|
||||
static std::unordered_map<std::string, msclr::auto_gcroot<BaseMissile^>> g_missiles;
|
||||
static std::unordered_map<std::string, msclr::auto_gcroot<Tank^>> g_targets;
|
||||
static std::string g_last_error;
|
||||
|
||||
// 辅助函数:设置错误信息
|
||||
void SetLastError(const char* error) {
|
||||
g_last_error = error;
|
||||
}
|
||||
|
||||
// 仿真管理
|
||||
THREATSOURCE_API int TS_CreateSimulation() {
|
||||
try {
|
||||
g_manager = gcnew SimulationManager();
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_INIT_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
THREATSOURCE_API int TS_DestroySimulation() {
|
||||
try {
|
||||
g_manager = nullptr;
|
||||
g_missiles.clear();
|
||||
g_targets.clear();
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
// 导弹相关
|
||||
THREATSOURCE_API int TS_CreateMissile(
|
||||
const char* id,
|
||||
double x, double y, double z,
|
||||
double vx, double vy, double vz,
|
||||
double max_speed,
|
||||
double max_acceleration,
|
||||
double max_flight_time,
|
||||
double max_flight_distance,
|
||||
double mass
|
||||
) {
|
||||
if (!id) {
|
||||
SetLastError("Invalid missile ID");
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
String^ managedId = gcnew String(id);
|
||||
|
||||
auto properties = gcnew MissileProperties();
|
||||
properties->Id = managedId;
|
||||
properties->InitialPosition = Vector3D(x, y, z);
|
||||
properties->InitialVelocity = Vector3D(vx, vy, vz);
|
||||
properties->MaxSpeed = max_speed;
|
||||
properties->MaxAcceleration = max_acceleration;
|
||||
properties->MaxFlightTime = max_flight_time;
|
||||
properties->MaxFlightDistance = max_flight_distance;
|
||||
properties->Mass = mass;
|
||||
|
||||
auto missile = gcnew TerminalSensitiveMissile(managedId, properties, g_manager);
|
||||
g_manager->RegisterEntity(managedId, missile);
|
||||
g_missiles[id] = missile;
|
||||
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
THREATSOURCE_API int TS_ActivateMissile(const char* id) {
|
||||
if (!id || g_missiles.find(id) == g_missiles.end()) {
|
||||
SetLastError("Invalid missile ID");
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
g_missiles[id]->Activate();
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
THREATSOURCE_API int TS_DeactivateMissile(const char* id) {
|
||||
if (!id || g_missiles.find(id) == g_missiles.end()) {
|
||||
SetLastError("Invalid missile ID");
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
g_missiles[id]->Deactivate();
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
THREATSOURCE_API int TS_FireMissile(const char* id) {
|
||||
if (!id || g_missiles.find(id) == g_missiles.end()) {
|
||||
SetLastError("Invalid missile ID");
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
g_missiles[id]->Fire();
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
// 目标相关
|
||||
THREATSOURCE_API int TS_CreateTarget(
|
||||
const char* id,
|
||||
double x, double y, double z,
|
||||
double orientation
|
||||
) {
|
||||
if (!id) {
|
||||
SetLastError("Invalid target ID");
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
String^ managedId = gcnew String(id);
|
||||
auto target = gcnew Tank(managedId, Vector3D(x, y, z), orientation, g_manager);
|
||||
g_manager->RegisterEntity(managedId, target);
|
||||
g_targets[id] = target;
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
// 仿真控制
|
||||
THREATSOURCE_API int TS_UpdateSimulation(double deltaTime) {
|
||||
try {
|
||||
for (auto& pair : g_missiles) {
|
||||
pair.second->Update(deltaTime);
|
||||
}
|
||||
for (auto& pair : g_targets) {
|
||||
pair.second->Update(deltaTime);
|
||||
}
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
SetLastError(msclr::interop::marshal_as<std::string>(e->Message).c_str());
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
|
||||
// 错误查询
|
||||
THREATSOURCE_API int TS_GetLastError(char* buffer, int buffer_size) {
|
||||
if (!buffer || buffer_size <= 0) {
|
||||
return THREATSOURCE_ERROR_INVALID_PARAM;
|
||||
}
|
||||
|
||||
try {
|
||||
strncpy(buffer, g_last_error.c_str(), buffer_size - 1);
|
||||
buffer[buffer_size - 1] = '\0';
|
||||
return THREATSOURCE_SUCCESS;
|
||||
}
|
||||
catch (...) {
|
||||
return THREATSOURCE_ERROR_SIMULATION_FAILED;
|
||||
}
|
||||
}
|
||||
103
docs/README.md
103
docs/README.md
@ -1,103 +0,0 @@
|
||||
# ThreatSource Library
|
||||
|
||||
## 项目描述
|
||||
|
||||
ThreatSource Library 是一个专门用于军事目标和武器系统模拟的 C# 类库。该库提供了一套完整的类和接口,用于模拟各种军事目标(如坦克)、指示器(如激光指示器)以及不同类型的导弹系统。
|
||||
|
||||
## 主要功能
|
||||
|
||||
- 目标模拟(Target)
|
||||
- 坦克(Tank)等地面目标的模拟
|
||||
- 指示器系统(Indicator)
|
||||
- 激光指示器(LaserDesignator)
|
||||
- 激光波束制导(LaserBeamRider)
|
||||
- 红外追踪器(InfraredTracker)
|
||||
- 导弹系统(Missile)
|
||||
- 基础导弹类(BaseMissile)
|
||||
- 激光波束制导导弹(LaserBeamRiderMissile)
|
||||
- 红外指令制导导弹(InfraredCommandGuidedMissile)
|
||||
- 激光半主动制导导弹(LaserSemiActiveGuidedMissile)
|
||||
- 红外成像末制导导弹(InfraredImagingTerminalGuidedMissile)
|
||||
- 毫米波末制导导弹(MillimeterWaveTerminalGuidedMissile)
|
||||
- 末敏导弹(TerminalSensitiveMissile)
|
||||
- 末敏子弹药(TerminalSensitiveSubmunition)
|
||||
|
||||
## 使用说明
|
||||
|
||||
1. 引用项目
|
||||
|
||||
```csharp
|
||||
using ThreatSource;
|
||||
```
|
||||
|
||||
2. 创建目标实例
|
||||
|
||||
```csharp
|
||||
var tank = new Tank();
|
||||
```
|
||||
|
||||
3. 创建指示器
|
||||
|
||||
```csharp
|
||||
var laserDesignator = new LaserDesignator();
|
||||
```
|
||||
|
||||
4. 创建导弹
|
||||
|
||||
```csharp
|
||||
var missile = new LaserBeamRiderMissile();
|
||||
```
|
||||
|
||||
## 项目结构
|
||||
|
||||
```text
|
||||
ThreatSource/
|
||||
├── Target/
|
||||
│ └── Tank.cs
|
||||
├── Indicator/
|
||||
│ ├── LaserDesignator.cs
|
||||
│ ├── LaserBeamRider.cs
|
||||
│ └── InfraredTracker.cs
|
||||
└── Missile/
|
||||
├── BaseMissile.cs
|
||||
├── LaserBeamRiderMissile.cs
|
||||
├── InfraredCommandGuidedMissile.cs
|
||||
├── LaserSemiActiveGuidedMissile.cs
|
||||
├── InfraredImagingTerminalGuidedMissile.cs
|
||||
├── MillimeterWaveTerminalGuidedMissile.cs
|
||||
├── TerminalSensitiveMissile.cs
|
||||
└── TerminalSensitiveSubmunition.cs
|
||||
```
|
||||
|
||||
## 开发环境
|
||||
|
||||
- .NET 6.0 或更高版本
|
||||
- Visual Studio 2022 或更高版本
|
||||
- xUnit(用于单元测试)
|
||||
|
||||
## 测试
|
||||
|
||||
项目使用 xUnit 作为测试框架。所有测试文件都位于 `ThreatSource.Tests` 目录下。
|
||||
|
||||
运行测试:
|
||||
|
||||
1. 在 Visual Studio 中打开测试资源管理器
|
||||
2. 点击"运行所有测试"或选择特定测试运行
|
||||
|
||||
或使用命令行:
|
||||
|
||||
```bash
|
||||
dotnet test
|
||||
```
|
||||
|
||||
## 贡献指南
|
||||
|
||||
1. Fork 项目
|
||||
2. 创建特性分支
|
||||
3. 提交更改
|
||||
4. 推送到分支
|
||||
5. 创建 Pull Request
|
||||
|
||||
## 许可证
|
||||
|
||||
MIT License
|
||||
@ -1,35 +1,197 @@
|
||||
# 入门指南
|
||||
|
||||
## 安装
|
||||
## 安装和使用
|
||||
|
||||
### C#版本
|
||||
### C#/.NET 版本
|
||||
|
||||
通过NuGet包管理器安装威胁源仿真库:
|
||||
1. 下载 ThreatSourceLibrary 包并解压
|
||||
2. 将以下文件复制到你的项目目录(建议放在 lib 文件夹下):
|
||||
- ThreatSource.dll - 主要的库文件
|
||||
- ThreatSource.deps.json - 依赖配置文件
|
||||
- ThreatSource.xml - API 文档文件
|
||||
|
||||
```bash
|
||||
dotnet add package ThreatSource
|
||||
3. 在 Visual Studio 中添加引用:
|
||||
- 右键项目 -> 添加 -> 引用
|
||||
- 浏览 -> 选择 ThreatSource.dll
|
||||
|
||||
4. 在代码中使用:
|
||||
|
||||
```csharp
|
||||
using ThreatSource.Simulation;
|
||||
|
||||
class Program
|
||||
{
|
||||
static void Main()
|
||||
{
|
||||
try
|
||||
{
|
||||
// 创建仿真管理器
|
||||
var simulationManager = new SimulationManager();
|
||||
|
||||
// 创建导弹配置
|
||||
var missileProperties = new MissileProperties
|
||||
{
|
||||
Id = "missile1",
|
||||
InitialPosition = new Vector3D(0, 0, 0),
|
||||
InitialVelocity = new Vector3D(0, 0, 0),
|
||||
MaxSpeed = 1000,
|
||||
MaxAcceleration = 10,
|
||||
MaxFlightTime = 30,
|
||||
MaxFlightDistance = 5000,
|
||||
Mass = 50
|
||||
};
|
||||
|
||||
// 创建导弹实例
|
||||
var missile = new TerminalSensitiveMissile(
|
||||
"target1",
|
||||
missileProperties,
|
||||
simulationManager
|
||||
);
|
||||
|
||||
// 注册实体
|
||||
simulationManager.RegisterEntity(missile.Id, missile);
|
||||
|
||||
// 激活并发射导弹
|
||||
missile.Activate();
|
||||
missile.Fire();
|
||||
|
||||
// 仿真主循环
|
||||
double deltaTime = 0.01;
|
||||
while (missile.IsActive)
|
||||
{
|
||||
missile.Update(deltaTime);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### C++版本
|
||||
|
||||
有两种使用方式:
|
||||
C++项目有两种使用方式:
|
||||
|
||||
#### 方式一:C++/CLI(推荐)
|
||||
#### 方式一:动态加载(推荐)
|
||||
|
||||
1. 创建C++/CLI项目(Visual Studio -> 新建项目 -> CLR类库)
|
||||
2. 通过NuGet包管理器安装ThreatSource
|
||||
3. 配置项目属性:
|
||||
- 公共语言运行时支持:/clr
|
||||
- 平台工具集:Visual Studio 2022 (v143)
|
||||
- .NET目标框架:net8.0
|
||||
这种方式适合纯C++项目,不需要配置CLR支持。
|
||||
|
||||
#### 方式二:原生C++
|
||||
1. 下载 ThreatSourceNative 包并解压
|
||||
2. 将 bin 目录下的所有 DLL 文件复制到程序目录
|
||||
3. 将 include/threat_source.h 添加到项目中
|
||||
4. 使用 C 风格接口调用库功能
|
||||
|
||||
1. 下载对应版本的 ThreatSource.dll
|
||||
2. 将DLL放置在项目输出目录
|
||||
3. 确保DLL版本与项目平台配置匹配(x86/x64)
|
||||
示例代码:
|
||||
|
||||
## C#基本用法
|
||||
```cpp
|
||||
#include "threat_source.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
// 初始化仿真
|
||||
if (TS_CreateSimulation() != THREATSOURCE_SUCCESS) {
|
||||
printf("Failed to create simulation\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 创建导弹
|
||||
const char* missile_id = "missile1";
|
||||
int result = TS_CreateMissile(
|
||||
missile_id,
|
||||
0, 0, 0, // 初始位置
|
||||
0, 0, 0, // 初始速度
|
||||
1000, // 最大速度
|
||||
10, // 最大加速度
|
||||
30, // 最大飞行时间
|
||||
5000, // 最大飞行距离
|
||||
50 // 质量
|
||||
);
|
||||
|
||||
if (result != THREATSOURCE_SUCCESS) {
|
||||
char error[256];
|
||||
TS_GetLastError(error, sizeof(error));
|
||||
printf("Failed to create missile: %s\n", error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 激活并发射导弹
|
||||
TS_ActivateMissile(missile_id);
|
||||
TS_FireMissile(missile_id);
|
||||
|
||||
// 仿真主循环
|
||||
double deltaTime = 0.01;
|
||||
int is_active = 1;
|
||||
|
||||
while (is_active) {
|
||||
TS_UpdateSimulation(deltaTime);
|
||||
TS_IsMissileActive(missile_id, &is_active);
|
||||
}
|
||||
|
||||
// 清理
|
||||
TS_DestroySimulation();
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
|
||||
#### 方式二:CLR 集成
|
||||
|
||||
如果需要使用 .NET 的完整功能,可以选择 CLR 集成方式:
|
||||
|
||||
1. 配置项目属性:
|
||||
- C/C++ -> 常规 -> 公共语言运行时支持:/clr
|
||||
- 常规 -> 平台工具集:Visual Studio 2022 (v143)
|
||||
- 常规 -> .NET目标框架:net8.0
|
||||
|
||||
2. 引用 ThreatSource.dll
|
||||
|
||||
示例代码:
|
||||
|
||||
```cpp
|
||||
using namespace System;
|
||||
using namespace ThreatSource::Simulation;
|
||||
|
||||
int main() {
|
||||
try {
|
||||
// 创建仿真管理器
|
||||
auto manager = gcnew SimulationManager();
|
||||
|
||||
// 创建导弹配置
|
||||
auto properties = gcnew MissileProperties();
|
||||
properties->Id = "missile1";
|
||||
properties->InitialPosition = Vector3D(0, 0, 0);
|
||||
properties->InitialVelocity = Vector3D(0, 0, 0);
|
||||
properties->MaxSpeed = 1000;
|
||||
properties->MaxAcceleration = 10;
|
||||
properties->MaxFlightTime = 30;
|
||||
properties->MaxFlightDistance = 5000;
|
||||
properties->Mass = 50;
|
||||
|
||||
// 创建导弹
|
||||
auto missile = gcnew TerminalSensitiveMissile("target1", properties, manager);
|
||||
manager->RegisterEntity(missile->Id, missile);
|
||||
|
||||
// 激活并发射导弹
|
||||
missile->Activate();
|
||||
missile->Fire();
|
||||
|
||||
// 仿真主循环
|
||||
double deltaTime = 0.01;
|
||||
while (missile->IsActive) {
|
||||
missile->Update(deltaTime);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception^ e) {
|
||||
Console::WriteLine("Error: {0}", e->Message);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 基本用法
|
||||
|
||||
### 初始化仿真管理器
|
||||
|
||||
@ -98,9 +260,7 @@ while (missile.IsActive)
|
||||
|
||||
## C++使用指南
|
||||
|
||||
在C++项目中使用威胁源仿真库有两种方式:C++/CLI和原生C++。以下重点介绍推荐的C++/CLI方式:
|
||||
|
||||
### C++/CLI方式(推荐)
|
||||
### C++/CLI基本用法
|
||||
|
||||
#### 1. 创建包装类
|
||||
|
||||
@ -176,28 +336,19 @@ int main()
|
||||
}
|
||||
```
|
||||
|
||||
### 原生C++方式
|
||||
|
||||
如果必须使用原生C++(不推荐),请参考以下方式:
|
||||
|
||||
### 注意事项
|
||||
|
||||
1. C++/CLI vs 原生C++
|
||||
- C++/CLI方式更简单,直接使用.NET类型
|
||||
- 原生C++方式需要更多的封装和转换工作
|
||||
- C++/CLI性能可能略低,但开发效率更高
|
||||
|
||||
2. 内存管理
|
||||
1. 内存管理
|
||||
- C++/CLI使用垃圾回收
|
||||
- 使用gcnew创建托管对象
|
||||
- 注意托管和非托管资源的混合使用
|
||||
|
||||
3. 错误处理
|
||||
2. 错误处理
|
||||
- 使用托管异常处理(try/catch)
|
||||
- 异常信息更详细,更容易调试
|
||||
- 可以直接使用.NET的日志机制
|
||||
|
||||
4. 类型系统
|
||||
3. 类型系统
|
||||
- 使用托管类型(^)
|
||||
- 注意值类型和引用类型的区别
|
||||
- 使用安全的类型转换
|
||||
|
||||
BIN
publish/ThreatSourceLibrary-1.0.0.zip
Normal file
BIN
publish/ThreatSourceLibrary-1.0.0.zip
Normal file
Binary file not shown.
Binary file not shown.
@ -9,6 +9,9 @@ temp_file="html_files.txt"
|
||||
# 获取当前目录的绝对路径
|
||||
current_dir=$(pwd)
|
||||
|
||||
# 创建发布目录(如果不存在)
|
||||
mkdir -p "${current_dir}/publish"
|
||||
|
||||
# 首先添加主页
|
||||
echo "file://${current_dir}/docs/_site/docs/index.html" >> $temp_file
|
||||
|
||||
@ -24,6 +27,11 @@ find "${current_dir}/docs/_site/docs/api" -name "*.html" | sed 's|^|file://|' >>
|
||||
# 构建wkhtmltopdf命令
|
||||
cmd="wkhtmltopdf \
|
||||
--enable-local-file-access \
|
||||
--enable-javascript \
|
||||
--javascript-delay 1000 \
|
||||
--no-stop-slow-scripts \
|
||||
--enable-external-links \
|
||||
--enable-internal-links \
|
||||
--page-size A4 \
|
||||
--margin-top 15 \
|
||||
--margin-bottom 15 \
|
||||
@ -43,7 +51,7 @@ while IFS= read -r file; do
|
||||
done < "$temp_file"
|
||||
|
||||
# 添加输出文件名
|
||||
cmd="$cmd \"${current_dir}/ThreatSource-Library.pdf\""
|
||||
cmd="$cmd \"${current_dir}/publish/ThreatSource-Library.pdf\""
|
||||
|
||||
# 执行命令
|
||||
eval $cmd
|
||||
@ -51,4 +59,4 @@ eval $cmd
|
||||
# 删除临时文件
|
||||
rm $temp_file
|
||||
|
||||
echo "PDF generation completed: ThreatSource-Library.pdf"
|
||||
echo "PDF generation completed: publish/ThreatSource-Library.pdf"
|
||||
33
scripts/pack_dll.sh
Executable file
33
scripts/pack_dll.sh
Executable file
@ -0,0 +1,33 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 获取版本号(从项目文件中)
|
||||
version=$(grep -o '<Version>[^<]*</Version>' ThreatSource/ThreatSource.csproj | sed 's/<Version>\(.*\)<\/Version>/\1/')
|
||||
|
||||
if [ -z "$version" ]; then
|
||||
echo "Error: Could not find version number in ThreatSource.csproj"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建发布目录(如果不存在)
|
||||
mkdir -p publish
|
||||
|
||||
# 设置打包文件名
|
||||
package_name="ThreatSourceLibrary-${version}"
|
||||
package_dir="publish/${package_name}"
|
||||
|
||||
# 创建临时目录
|
||||
mkdir -p "${package_dir}"
|
||||
|
||||
# 复制文件
|
||||
cp ThreatSource/bin/Release/net8.0/ThreatSource.dll "${package_dir}/"
|
||||
cp ThreatSource/bin/Release/net8.0/ThreatSource.deps.json "${package_dir}/"
|
||||
cp ThreatSource/bin/Release/net8.0/ThreatSource.xml "${package_dir}/"
|
||||
|
||||
# 创建 zip 文件
|
||||
cd publish
|
||||
zip -r "${package_name}.zip" "${package_name}"
|
||||
|
||||
# 清理临时目录
|
||||
rm -rf "${package_name}"
|
||||
|
||||
echo "Package created: publish/${package_name}.zip"
|
||||
116
scripts/pack_native.sh
Normal file
116
scripts/pack_native.sh
Normal file
@ -0,0 +1,116 @@
|
||||
#!/bin/bash
|
||||
|
||||
# 获取版本号(从项目文件中)
|
||||
version=$(grep -o '<Version>[^<]*</Version>' ThreatSource/ThreatSource.csproj | sed 's/<Version>\(.*\)<\/Version>/\1/')
|
||||
|
||||
if [ -z "$version" ]; then
|
||||
echo "Error: Could not find version number in ThreatSource.csproj"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 创建发布目录(如果不存在)
|
||||
mkdir -p publish
|
||||
|
||||
# 设置打包文件名
|
||||
package_name="ThreatSourceNative-${version}"
|
||||
package_dir="publish/${package_name}"
|
||||
|
||||
# 创建临时目录
|
||||
mkdir -p "${package_dir}/bin"
|
||||
mkdir -p "${package_dir}/include"
|
||||
|
||||
# 复制文件
|
||||
cp ThreatSourceNative/bin/Release/x64/ThreatSourceNative.dll "${package_dir}/bin/"
|
||||
cp ThreatSource/bin/Release/net8.0/ThreatSource.dll "${package_dir}/bin/"
|
||||
cp ThreatSource/bin/Release/net8.0/ThreatSource.deps.json "${package_dir}/bin/"
|
||||
cp ThreatSourceNative/include/threat_source.h "${package_dir}/include/"
|
||||
|
||||
# 创建说明文件
|
||||
cat > "${package_dir}/README.md" << EOL
|
||||
# ThreatSource Native Library
|
||||
|
||||
版本:${version}
|
||||
|
||||
## 文件说明
|
||||
|
||||
- bin/ThreatSourceNative.dll - 原生接口库
|
||||
- bin/ThreatSource.dll - 核心库
|
||||
- bin/ThreatSource.deps.json - 依赖配置文件
|
||||
- include/threat_source.h - C接口头文件
|
||||
|
||||
## 使用方法
|
||||
|
||||
1. 将 bin 目录下的所有 DLL 文件复制到你的程序目录
|
||||
2. 将 include 目录下的头文件添加到你的项目中
|
||||
3. 在代码中包含头文件:
|
||||
\`\`\`cpp
|
||||
#include "threat_source.h"
|
||||
\`\`\`
|
||||
|
||||
## 示例代码
|
||||
|
||||
\`\`\`cpp
|
||||
#include "threat_source.h"
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
// 初始化仿真
|
||||
if (TS_CreateSimulation() != THREATSOURCE_SUCCESS) {
|
||||
printf("Failed to create simulation\\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 创建导弹
|
||||
const char* missile_id = "missile1";
|
||||
int result = TS_CreateMissile(
|
||||
missile_id,
|
||||
0, 0, 0, // 初始位置
|
||||
0, 0, 0, // 初始速度
|
||||
1000, // 最大速度
|
||||
10, // 最大加速度
|
||||
30, // 最大飞行时间
|
||||
5000, // 最大飞行距离
|
||||
50 // 质量
|
||||
);
|
||||
|
||||
if (result != THREATSOURCE_SUCCESS) {
|
||||
char error[256];
|
||||
TS_GetLastError(error, sizeof(error));
|
||||
printf("Failed to create missile: %s\\n", error);
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 激活并发射导弹
|
||||
TS_ActivateMissile(missile_id);
|
||||
TS_FireMissile(missile_id);
|
||||
|
||||
// 仿真主循环
|
||||
double deltaTime = 0.01;
|
||||
int is_active = 1;
|
||||
|
||||
while (is_active) {
|
||||
TS_UpdateSimulation(deltaTime);
|
||||
TS_IsMissileActive(missile_id, &is_active);
|
||||
}
|
||||
|
||||
// 清理
|
||||
TS_DestroySimulation();
|
||||
return 0;
|
||||
}
|
||||
\`\`\`
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. 确保所有 DLL 文件在运行时可以被找到
|
||||
2. 检查每个函数的返回值,确保调用成功
|
||||
3. 如果函数返回错误,使用 TS_GetLastError 获取详细信息
|
||||
EOL
|
||||
|
||||
# 创建 zip 文件
|
||||
cd publish
|
||||
zip -r "${package_name}.zip" "${package_name}"
|
||||
|
||||
# 清理临时目录
|
||||
rm -rf "${package_name}"
|
||||
|
||||
echo "Package created: publish/${package_name}.zip"
|
||||
Loading…
Reference in New Issue
Block a user