LIJU 2 месяцев назад
Родитель
Сommit
ca6092c735

+ 1 - 1
.vscode/settings.json

@@ -1,4 +1,4 @@
 {
-    "liveServer.settings.port": 5501,
+    "liveServer.settings.port": 5502,
     "dotnet.preferCSharpExtension": true
 }

+ 412 - 0
test_debug_info_preservation.html

@@ -0,0 +1,412 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>工伤接口Debug信息保留测试</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            margin: 20px;
+            background-color: #f5f5f5;
+        }
+        .container {
+            max-width: 1200px;
+            margin: 0 auto;
+            background-color: white;
+            padding: 20px;
+            border-radius: 8px;
+            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+        }
+        h1 {
+            color: #333;
+            text-align: center;
+            margin-bottom: 30px;
+        }
+        .test-section {
+            margin-bottom: 30px;
+            padding: 20px;
+            border: 1px solid #ddd;
+            border-radius: 5px;
+            background-color: #fafafa;
+        }
+        .test-section h3 {
+            color: #555;
+            margin-top: 0;
+        }
+        button {
+            background-color: #007bff;
+            color: white;
+            border: none;
+            padding: 10px 20px;
+            border-radius: 5px;
+            cursor: pointer;
+            margin: 5px;
+            font-size: 14px;
+        }
+        button:hover {
+            background-color: #0056b3;
+        }
+        button:disabled {
+            background-color: #6c757d;
+            cursor: not-allowed;
+        }
+        .result {
+            margin-top: 15px;
+            padding: 15px;
+            border-radius: 5px;
+            white-space: pre-wrap;
+            font-family: 'Courier New', monospace;
+            font-size: 12px;
+            max-height: 400px;
+            overflow-y: auto;
+        }
+        .success {
+            background-color: #d4edda;
+            border: 1px solid #c3e6cb;
+            color: #155724;
+        }
+        .error {
+            background-color: #f8d7da;
+            border: 1px solid #f5c6cb;
+            color: #721c24;
+        }
+        .info {
+            background-color: #d1ecf1;
+            border: 1px solid #bee5eb;
+            color: #0c5460;
+        }
+        .debug-info {
+            background-color: #fff3cd;
+            border: 1px solid #ffeaa7;
+            color: #856404;
+            margin-top: 10px;
+            padding: 10px;
+            border-radius: 3px;
+        }
+        .status {
+            display: inline-block;
+            padding: 3px 8px;
+            border-radius: 3px;
+            font-size: 12px;
+            font-weight: bold;
+        }
+        .status.success {
+            background-color: #28a745;
+            color: white;
+        }
+        .status.error {
+            background-color: #dc3545;
+            color: white;
+        }
+        .status.info {
+            background-color: #17a2b8;
+            color: white;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>工伤接口Debug信息保留测试</h1>
+        
+        <div class="test-section">
+            <h3>测试说明</h3>
+            <p>此页面用于测试工伤接口的debug信息是否正确保留。主要检查以下字段是否在返回结果中存在:</p>
+            <ul>
+                <li><strong>debug_entry_time</strong>: 方法入口时间</li>
+                <li><strong>debug_method_entered</strong>: 方法是否已进入</li>
+                <li><strong>debug_stage</strong>: 当前执行阶段</li>
+                <li><strong>debug_timestamp</strong>: 时间戳</li>
+                <li><strong>debug_step</strong>: 执行步骤</li>
+                <li><strong>debug_request</strong>: 请求参数</li>
+                <li><strong>debug_action</strong>: 操作类型</li>
+            </ul>
+        </div>
+
+        <div class="test-section">
+            <h3>初始化测试</h3>
+            <p>测试初始化接口,检查debug信息是否被正确保留:</p>
+            <button onclick="testInit()">测试初始化</button>
+            <button onclick="testInitWithConfig()">测试初始化(带配置)</button>
+            <button onclick="testInitTestMode()">测试初始化(测试模式)</button>
+            <div id="initResult" class="result" style="display: none;"></div>
+        </div>
+
+        <div class="test-section">
+            <h3>健康检查测试</h3>
+            <p>测试健康检查接口,检查debug信息是否被正确保留:</p>
+            <button onclick="testHealth()">测试健康检查</button>
+            <div id="healthResult" class="result" style="display: none;"></div>
+        </div>
+
+        <div class="test-section">
+            <h3>统计信息测试</h3>
+            <p>测试统计信息接口,检查debug信息是否被正确保留:</p>
+            <button onclick="testStats()">测试统计信息</button>
+            <div id="statsResult" class="result" style="display: none;"></div>
+        </div>
+
+        <div class="test-section">
+            <h3>签到状态测试</h3>
+            <p>测试签到状态接口,检查debug信息是否被正确保留:</p>
+            <button onclick="testSignInStatus()">测试签到状态</button>
+            <div id="signInStatusResult" class="result" style="display: none;"></div>
+        </div>
+
+        <div class="test-section">
+            <h3>批量测试</h3>
+            <p>批量测试所有接口,检查debug信息保留情况:</p>
+            <button onclick="runAllTests()">运行所有测试</button>
+            <div id="allTestsResult" class="result" style="display: none;"></div>
+        </div>
+    </div>
+
+    <script>
+        const API_BASE_URL = 'http://localhost:8321/api/entry/workinjury';
+        
+        // 通用API调用函数
+        async function callAPI(requestData) {
+            try {
+                const response = await fetch(API_BASE_URL, {
+                    method: 'POST',
+                    headers: {
+                        'Content-Type': 'application/json',
+                    },
+                    body: JSON.stringify(requestData)
+                });
+                
+                const result = await response.json();
+                return {
+                    success: true,
+                    status: response.status,
+                    data: result
+                };
+            } catch (error) {
+                return {
+                    success: false,
+                    error: error.message,
+                    data: null
+                };
+            }
+        }
+
+        // 检查debug信息是否完整
+        function checkDebugInfo(data, testName) {
+            const requiredFields = [
+                'debug_entry_time',
+                'debug_method_entered', 
+                'debug_stage',
+                'debug_timestamp',
+                'debug_step'
+            ];
+            
+            const missingFields = [];
+            const presentFields = [];
+            
+            requiredFields.forEach(field => {
+                if (data[field] !== undefined && data[field] !== null) {
+                    presentFields.push(field);
+                } else {
+                    missingFields.push(field);
+                }
+            });
+            
+            return {
+                testName: testName,
+                allPresent: missingFields.length === 0,
+                presentFields: presentFields,
+                missingFields: missingFields,
+                totalRequired: requiredFields.length,
+                presentCount: presentFields.length
+            };
+        }
+
+        // 显示结果
+        function showResult(elementId, apiResult, testName) {
+            const element = document.getElementById(elementId);
+            element.style.display = 'block';
+            
+            if (!apiResult.success) {
+                element.className = 'result error';
+                element.textContent = `API调用失败: ${apiResult.error}`;
+                return;
+            }
+            
+            const debugCheck = checkDebugInfo(apiResult.data, testName);
+            
+            let resultText = `=== ${testName} ===\n`;
+            resultText += `HTTP状态: ${apiResult.status}\n`;
+            resultText += `API成功: ${apiResult.data.success}\n`;
+            resultText += `返回代码: ${apiResult.data.code}\n`;
+            resultText += `消息: ${apiResult.data.message}\n\n`;
+            
+            resultText += `=== Debug信息检查 ===\n`;
+            resultText += `完整性: ${debugCheck.allPresent ? '✅ 完整' : '❌ 不完整'}\n`;
+            resultText += `必需字段: ${debugCheck.totalRequired}\n`;
+            resultText += `存在字段: ${debugCheck.presentCount}\n`;
+            resultText += `缺失字段: ${debugCheck.missingFields.length > 0 ? debugCheck.missingFields.join(', ') : '无'}\n\n`;
+            
+            resultText += `=== 存在的Debug字段 ===\n`;
+            debugCheck.presentFields.forEach(field => {
+                resultText += `${field}: ${apiResult.data[field]}\n`;
+            });
+            
+            if (debugCheck.missingFields.length > 0) {
+                resultText += `\n=== 缺失的Debug字段 ===\n`;
+                debugCheck.missingFields.forEach(field => {
+                    resultText += `${field}: 缺失\n`;
+                });
+            }
+            
+            resultText += `\n=== 完整响应数据 ===\n`;
+            resultText += JSON.stringify(apiResult.data, null, 2);
+            
+            element.className = debugCheck.allPresent ? 'result success' : 'result error';
+            element.textContent = resultText;
+        }
+
+        // 测试初始化
+        async function testInit() {
+            const requestData = {
+                action: "init",
+                timestamp: new Date().toISOString()
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('initResult', result, '初始化测试');
+        }
+
+        // 测试初始化(带配置)
+        async function testInitWithConfig() {
+            const requestData = {
+                action: "init",
+                timestamp: new Date().toISOString(),
+                config: {
+                    fixmedinsCode: "SQ201348",
+                    fixmedinsName: "沭阳铭和医院",
+                    interfaceVersion: "V2.1"
+                }
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('initResult', result, '初始化测试(带配置)');
+        }
+
+        // 测试初始化(测试模式)
+        async function testInitTestMode() {
+            const requestData = {
+                action: "init",
+                timestamp: new Date().toISOString(),
+                test_mode: "immediate_return",
+                config: {
+                    fixmedinsCode: "SQ201348",
+                    fixmedinsName: "沭阳铭和医院",
+                    interfaceVersion: "V2.1"
+                }
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('initResult', result, '初始化测试(测试模式)');
+        }
+
+        // 测试健康检查
+        async function testHealth() {
+            const requestData = {
+                action: "health",
+                timestamp: new Date().toISOString()
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('healthResult', result, '健康检查测试');
+        }
+
+        // 测试统计信息
+        async function testStats() {
+            const requestData = {
+                action: "stats",
+                timestamp: new Date().toISOString()
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('statsResult', result, '统计信息测试');
+        }
+
+        // 测试签到状态
+        async function testSignInStatus() {
+            const requestData = {
+                action: "signin_status",
+                timestamp: new Date().toISOString()
+            };
+            
+            const result = await callAPI(requestData);
+            showResult('signInStatusResult', result, '签到状态测试');
+        }
+
+        // 运行所有测试
+        async function runAllTests() {
+            const element = document.getElementById('allTestsResult');
+            element.style.display = 'block';
+            element.className = 'result info';
+            element.textContent = '正在运行所有测试...';
+            
+            const tests = [
+                { name: '初始化', func: testInit },
+                { name: '初始化(带配置)', func: testInitWithConfig },
+                { name: '初始化(测试模式)', func: testInitTestMode },
+                { name: '健康检查', func: testHealth },
+                { name: '统计信息', func: testStats },
+                { name: '签到状态', func: testSignInStatus }
+            ];
+            
+            let allResults = `=== 批量测试结果 ===\n`;
+            let successCount = 0;
+            let totalCount = tests.length;
+            
+            for (const test of tests) {
+                allResults += `\n--- ${test.name} ---\n`;
+                
+                const requestData = {
+                    action: test.name.includes('初始化') ? 'init' : 
+                           test.name.includes('健康') ? 'health' :
+                           test.name.includes('统计') ? 'stats' :
+                           test.name.includes('签到') ? 'signin_status' : 'init',
+                    timestamp: new Date().toISOString()
+                };
+                
+                if (test.name.includes('带配置')) {
+                    requestData.config = {
+                        fixmedinsCode: "SQ201348",
+                        fixmedinsName: "沭阳铭和医院",
+                        interfaceVersion: "V2.1"
+                    };
+                } else if (test.name.includes('测试模式')) {
+                    requestData.test_mode = "immediate_return";
+                    requestData.config = {
+                        fixmedinsCode: "SQ201348",
+                        fixmedinsName: "沭阳铭和医院",
+                        interfaceVersion: "V2.1"
+                    };
+                }
+                
+                const result = await callAPI(requestData);
+                const debugCheck = checkDebugInfo(result.data || {}, test.name);
+                
+                allResults += `状态: ${result.success ? '✅ 成功' : '❌ 失败'}\n`;
+                allResults += `Debug完整性: ${debugCheck.allPresent ? '✅ 完整' : '❌ 不完整'}\n`;
+                allResults += `Debug字段: ${debugCheck.presentCount}/${debugCheck.totalRequired}\n`;
+                
+                if (result.success) successCount++;
+            }
+            
+            allResults += `\n=== 总结 ===\n`;
+            allResults += `总测试数: ${totalCount}\n`;
+            allResults += `成功数: ${successCount}\n`;
+            allResults += `失败数: ${totalCount - successCount}\n`;
+            allResults += `成功率: ${((successCount / totalCount) * 100).toFixed(1)}%\n`;
+            
+            element.className = successCount === totalCount ? 'result success' : 'result error';
+            element.textContent = allResults;
+        }
+    </script>
+</body>
+</html> 

+ 190 - 0
test_debug_preservation_simple.html

@@ -0,0 +1,190 @@
+<!DOCTYPE html>
+<html lang="zh-CN">
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>Debug信息保留简单测试</title>
+    <style>
+        body {
+            font-family: Arial, sans-serif;
+            margin: 20px;
+            background-color: #f5f5f5;
+        }
+        .container {
+            max-width: 800px;
+            margin: 0 auto;
+            background-color: white;
+            padding: 20px;
+            border-radius: 8px;
+            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+        }
+        h1 {
+            color: #333;
+            text-align: center;
+        }
+        .test-button {
+            background-color: #007bff;
+            color: white;
+            border: none;
+            padding: 15px 30px;
+            border-radius: 5px;
+            cursor: pointer;
+            font-size: 16px;
+            margin: 10px;
+            width: 100%;
+        }
+        .test-button:hover {
+            background-color: #0056b3;
+        }
+        .result {
+            margin-top: 20px;
+            padding: 15px;
+            border-radius: 5px;
+            white-space: pre-wrap;
+            font-family: 'Courier New', monospace;
+            font-size: 12px;
+            max-height: 500px;
+            overflow-y: auto;
+        }
+        .success {
+            background-color: #d4edda;
+            border: 1px solid #c3e6cb;
+            color: #155724;
+        }
+        .error {
+            background-color: #f8d7da;
+            border: 1px solid #f5c6cb;
+            color: #721c24;
+        }
+        .info {
+            background-color: #d1ecf1;
+            border: 1px solid #bee5eb;
+            color: #0c5460;
+        }
+        .debug-field {
+            background-color: #fff3cd;
+            border: 1px solid #ffeaa7;
+            color: #856404;
+            padding: 5px;
+            margin: 2px 0;
+            border-radius: 3px;
+        }
+    </style>
+</head>
+<body>
+    <div class="container">
+        <h1>Debug信息保留功能测试</h1>
+        
+        <p>此页面用于测试工伤接口的debug信息是否正确保留。点击下面的按钮进行测试:</p>
+        
+        <button class="test-button" onclick="testDebugPreservation()">
+            测试Debug信息保留功能
+        </button>
+        
+        <div id="result" class="result" style="display: none;"></div>
+    </div>
+
+    <script>
+        const API_BASE_URL = 'http://localhost:8321/api/entry/workinjury';
+        
+        async function testDebugPreservation() {
+            const resultDiv = document.getElementById('result');
+            resultDiv.style.display = 'block';
+            resultDiv.className = 'result info';
+            resultDiv.textContent = '正在测试...';
+            
+            try {
+                // 测试初始化接口
+                const requestData = {
+                    action: "init",
+                    timestamp: new Date().toISOString(),
+                    config: {
+                        fixmedinsCode: "SQ201348",
+                        fixmedinsName: "沭阳铭和医院",
+                        interfaceVersion: "V2.1"
+                    }
+                };
+                
+                const response = await fetch(API_BASE_URL, {
+                    method: 'POST',
+                    headers: {
+                        'Content-Type': 'application/json',
+                    },
+                    body: JSON.stringify(requestData)
+                });
+                
+                const result = await response.json();
+                
+                // 检查debug信息是否完整
+                const requiredDebugFields = [
+                    'debug_entry_time',
+                    'debug_method_entered',
+                    'debug_stage',
+                    'debug_timestamp',
+                    'debug_step'
+                ];
+                
+                const presentFields = [];
+                const missingFields = [];
+                
+                requiredDebugFields.forEach(field => {
+                    if (result[field] !== undefined && result[field] !== null) {
+                        presentFields.push(field);
+                    } else {
+                        missingFields.push(field);
+                    }
+                });
+                
+                // 生成测试报告
+                let report = `=== Debug信息保留测试报告 ===\n\n`;
+                report += `HTTP状态: ${response.status}\n`;
+                report += `API成功: ${result.success}\n`;
+                report += `返回代码: ${result.code}\n`;
+                report += `消息: ${result.message}\n\n`;
+                
+                report += `=== Debug信息完整性检查 ===\n`;
+                report += `必需字段数: ${requiredDebugFields.length}\n`;
+                report += `存在字段数: ${presentFields.length}\n`;
+                report += `缺失字段数: ${missingFields.length}\n`;
+                report += `完整性: ${missingFields.length === 0 ? '✅ 完整' : '❌ 不完整'}\n\n`;
+                
+                if (presentFields.length > 0) {
+                    report += `=== 存在的Debug字段 ===\n`;
+                    presentFields.forEach(field => {
+                        report += `✅ ${field}: ${result[field]}\n`;
+                    });
+                    report += `\n`;
+                }
+                
+                if (missingFields.length > 0) {
+                    report += `=== 缺失的Debug字段 ===\n`;
+                    missingFields.forEach(field => {
+                        report += `❌ ${field}: 缺失\n`;
+                    });
+                    report += `\n`;
+                }
+                
+                report += `=== 测试结论 ===\n`;
+                if (missingFields.length === 0) {
+                    report += `🎉 测试通过!所有必需的debug信息都被正确保留。\n`;
+                    report += `✅ Debug信息保留功能工作正常。\n`;
+                } else {
+                    report += `⚠️ 测试失败!部分debug信息丢失。\n`;
+                    report += `❌ 需要检查代码中的debug信息保留逻辑。\n`;
+                }
+                
+                report += `\n=== 完整响应数据 ===\n`;
+                report += JSON.stringify(result, null, 2);
+                
+                // 设置结果显示样式
+                resultDiv.className = missingFields.length === 0 ? 'result success' : 'result error';
+                resultDiv.textContent = report;
+                
+            } catch (error) {
+                resultDiv.className = 'result error';
+                resultDiv.textContent = `测试失败: ${error.message}\n\n请确保:\n1. 工伤接口服务正在运行\n2. 服务地址为: ${API_BASE_URL}\n3. 网络连接正常`;
+            }
+        }
+    </script>
+</body>
+</html> 

+ 122 - 0
工伤接口常见问题与排查分析.md

@@ -0,0 +1,122 @@
+# 江苏工伤联网接口常见问题与排查分析
+
+---
+
+## 1. 现象与用户问题描述
+
+### 1.1 主要现象
+- **没有 DLL 时**,初始化接口能返回“找不到JSSiInterface.dll文件”的 JSON,说明 HTTP 服务和 C# 层逻辑是通的,异常能被捕获并返回。
+- **有 DLL 时**,如果 DLL 位数不对,会报 `BadImageFormatException`,已排除该问题。
+- **有 DLL 且位数正确时**,初始化接口返回 200,但**没有任何返回内容**(即 HTTP body 为空),其他接口状态是 cancel。
+- **用官方测试软件**,在同一目录下 DLL 能正常调用,说明 DLL 本身没坏,路径也没问题。
+
+### 1.2 用户典型问题
+- “初始化报200,但没有返回任何信息,其他接口状态都是cancel。”
+- “把工伤dll去了,初始化接口能返回找不到DLL的错误。”
+- “用官方测试软件,调用同目录下的DLL没问题。”
+- “之前怀疑是DLL位数不对,已排除。”
+- “现在应该是什么问题?”
+
+---
+
+## 2. 代码逻辑梳理
+
+### 2.1 主要流程
+1. **HTTP POST 到 /api/entry/workinjury**
+2. **EntryController.cs** 解析请求,分发到 `JiangSuWorkInjuryBusiness`
+3. **JiangSuWorkInjuryBusiness.cs**
+   - 检查 DLL 是否存在
+   - 调用 `Si_INIT` 或 `Si_Busi`
+   - 捕获异常,返回 JSON
+
+### 2.2 异常处理与 debug 逻辑
+- 所有关键点均有 try-catch,catch 里会构造 JSON 返回。
+- 只要没有致命崩溃,理论上都应该有 JSON 返回(如找不到 DLL、参数错、调用失败等)。
+
+---
+
+## 3. 为什么会出现“200但无返回内容”?
+
+### 3.1 可能原因
+1. **进程崩溃**
+   - 只要 C# 进程在处理请求时崩溃(如 DLL 内部崩溃、访问非法内存等),IIS/Kestrel 会直接断开连接,前端收到 200 但无 body。
+   - 这种情况 catch 也捕获不到,因为进程直接挂掉了。
+2. **死循环或阻塞**
+   - 如果代码卡死在某一步(如 DLL 调用卡死),前端会超时,显示 cancel。
+3. **未正确返回**
+   - 理论上所有分支都返回了 JSON,除非进程崩溃,否则不会无返回。
+
+### 3.2 结合现象分析
+- 没有 DLL 时能返回 JSON,说明异常捕获和返回逻辑没问题。
+- 有 DLL 时无返回,说明只要进入 DLL 调用,进程就崩溃了,catch 也捕获不到。
+
+---
+
+## 4. 和官方测试软件的区别
+- 官方测试软件能正常调用,说明 DLL 本身没坏,路径也没错。
+- 服务用同样的 DLL 却崩溃,说明调用方式、参数、或运行环境有差异。
+
+---
+
+## 5. 代码层面可能的逻辑问题排查
+
+### 5.1 DllImport 声明
+- `[DllImport("JSSiInterface.dll", EntryPoint = "Si_INIT", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]`
+- **需确认 EntryPoint、CharSet、CallingConvention 是否和官方测试软件一致。**
+
+### 5.2 参数传递
+- `Si_INIT(StringBuilder pErrMsg)`
+  - StringBuilder 分配的长度是否足够?(建议 4096+)
+- `Si_Busi(string inputdata, StringBuilder outputdata)`
+  - inputdata 格式是否和官方测试软件一致?
+
+### 5.3 运行环境
+- 服务为 Web API,官方测试软件可能为 WinForm/Console,有些 DLL 只支持 STA 线程或有 UI 线程依赖。
+- IIS Express/Kestrel 运行权限、当前目录、依赖库路径等可能和官方测试软件不同。
+
+### 5.4 依赖 DLL 问题
+- JSSiInterface.dll 可能还依赖其他 DLL(如 VC++ 运行库、其他业务 DLL),缺少依赖时也会崩溃。
+- 建议用 [Dependency Walker](http://www.dependencywalker.com/) 或 [Dependencies](https://github.com/lucasg/Dependencies) 检查依赖。
+
+---
+
+## 6. 建议的排查步骤
+
+1. **确认 DllImport 声明和官方测试软件完全一致**(包括参数类型、调用约定)。
+2. **用 try-catch 包裹所有 DLL 调用**,并在 catch 里加日志,确认是否能捕获到异常。
+3. **用 Process Monitor** 监控 Web API 进程,看是否有 DLL 加载失败、依赖缺失。
+4. **用 Dependency Walker 检查 DLL 依赖**,确保所有依赖都在 bin\x86\Release 下。
+5. **尝试用 Console 程序调用你的 DLL 代码**,排除 Web API 环境差异。
+6. **确认 IIS Express/Kestrel 的启动目录和权限**,和官方测试软件保持一致。
+
+---
+
+## 7. 结论
+
+- C# 代码逻辑本身没有明显问题,异常捕获和返回都很完善。
+- 只要进入 DLL 调用就无返回,99% 是 DLL 内部崩溃或依赖缺失,不是 C# 代码逻辑问题。
+- 建议重点排查 DLL 依赖、调用参数、运行环境差异。
+
+---
+
+## 8. 附:常见问题与术语解释
+
+### 8.1 DllImport 只是声明,不会自动加载 DLL
+- 只有实际调用方法时,.NET 才会去加载 DLL。
+- 只是声明,不会报错,也不会加载 DLL。
+
+### 8.2 "加载" DLL 的含义
+- 指 .NET 运行时在调用 DllImport 方法时,将 DLL 文件加载到进程内存空间,并解析导出函数。
+- 如果 DLL 位数不匹配、依赖缺失、导出函数签名不对,都会导致加载失败或调用崩溃。
+
+---
+
+## 9. 建议收集的信息(便于进一步排查)
+- DllImport 声明和官方测试软件的声明对比
+- 传递给 DLL 的参数示例
+- Web API 运行方式(IIS Express/Kestrel/自托管)
+- 官方测试软件的类型(WinForm/Console)
+
+---
+
+如需进一步协助,请补充上述信息,便于更有针对性地定位和解决问题。