8 Commits

Author SHA1 Message Date
d0ca1c8813 html업데이트 2025-12-13 02:11:50 +09:00
6fbfa52a00 template 폴더에 압축파일을 두고 그것을 자동 압축 해제하도록 함 , webview2 runtime 을 추가 2025-12-11 22:41:51 +09:00
1fd7c25c8d 메뉴얼 파일 압축 해제 관련 기능 추가 2025-12-11 00:50:51 +09:00
132ddc6495 "Replace OWIN self-hosting with WebView2 virtual hosting" -m "-
Remove OWIN server implementation (StaticFileServer, Startup)" -m "- Implement
    WebView2 SetVirtualHostNameToFolderMapping in Frm_WebManual" -m "- Remove all
   OWIN NuGet packages from packages.config and .vbproj" -m "- Add comprehensive
   guide document (WEBVIEW2_VIRTUAL_HOSTING.md)" -m "- Mark legacy OWIN files as
   deprecated
2025-12-01 20:55:42 +09:00
1d6c51df3b .. 2025-10-14 22:14:31 +09:00
40842778e0 WebView2 통합 및 Fixed Version 배포 방식 구현
- WebView2 Fixed Version 지원 추가 (오프라인 환경 대응)
- Frm_WebManual에 InitializeWebView2Async() 구현
  - WebView2Runtime 폴더 우선 사용 (Fixed Version)
  - 시스템 런타임으로 폴백
- MdiMain에 CheckWebView2Runtime() 추가
- Setup1.vdproj에 .NET Framework 4.8 배포 설정 반영
- .gitignore에 WebView2Runtime/, WebView2Data/ 추가
- claudedocs/WebView2_Deployment_Guide.md 배포 가이드 추가
  - Fixed Version 다운로드 및 배포 방법
  - 테스트 및 문제 해결 가이드

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 16:53:42 +09:00
6cd2abe560 .NET Framework 4.8 업그레이드 및 WebView2 통합
- 모든 프로젝트를 .NET Framework 4.0 → 4.8로 업그레이드
- WebView2 NuGet 패키지 추가 (v1.0.3537.50)
- 사용자 매뉴얼 폼 추가 (Frm_WebManual)
  * WebView2 컨트롤 통합
  * localhost:58123 자동 로드
  * MDI 메인 메뉴에 Manual 항목 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-10 15:37:23 +09:00
0eaeeb0aac add webhosting 2025-10-04 22:13:51 +09:00
39 changed files with 2387 additions and 456 deletions

8
.gitignore vendored
View File

@@ -8,3 +8,11 @@ obj
/Setup1/Debug
/Dotfuscated
UpgradeLog.htm
Packages
.vs
/NUL
# WebView2 Runtime (Fixed Version - 약 100-150MB, 설치 프로그램에 포함)
WebView2Runtime/
# WebView2 User Data (캐시, 쿠키 등 - 런타임 시 자동 생성)
WebView2Data/

4
.vscode/settings.json vendored Normal file
View File

@@ -0,0 +1,4 @@
{
"dotnet.preferCSharpExtension": true,
"dotnet.defaultSolution": "ArinWareT4.sln"
}

View File

@@ -13,7 +13,7 @@
<AssemblyName>ArinLog.Net4</AssemblyName>
<FileAlignment>512</FileAlignment>
<MyType>Windows</MyType>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@@ -15,7 +15,7 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -15,7 +15,7 @@
<UpgradeBackupLocation>
</UpgradeBackupLocation>
<OldToolsVersion>3.5</OldToolsVersion>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -1,6 +1,6 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2010
# Visual Studio 2022
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SubProject", "SubProject", "{4D184935-DE50-4DBA-9EBF-8C66C579B7DC}"
EndProject
Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "ECO2_2025V1", "ArinWarev1\ECO2_2025V1.vbproj", "{D5C51BDE-68E5-42BC-B648-DB9CCF044703}"
@@ -17,6 +17,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Utility", "Utility\Utility.
EndProject
Project("{54435603-DBB4-11D2-8724-00A0C9A8B90C}") = "Setup1", "Setup1\Setup1.vdproj", "{0E52FBAC-1A86-4722-93D0-CA7B8570B617}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A01A7396-C1BE-4D13-8B51-C9C1830DA088}"
ProjectSection(SolutionItems) = preProject
CLAUDE.md = CLAUDE.md
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
CD_ROM|Any CPU = CD_ROM|Any CPU

View File

@@ -29,8 +29,10 @@
<OldToolsVersion>3.5</OldToolsVersion>
<ApplicationManifest>My Project\app.manifest</ApplicationManifest>
<ApplicationIcon>002.ico</ApplicationIcon>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
<NuGetPackageImportStamp>
</NuGetPackageImportStamp>
<PublishUrl>ftp://tindevil.com/www/mynetapp/t4/</PublishUrl>
<Install>true</Install>
<InstallFrom>Web</InstallFrom>
@@ -57,7 +59,7 @@
<DebugType>full</DebugType>
<DefineDebug>true</DefineDebug>
<DefineTrace>true</DefineTrace>
<OutputPath>..\..\..\..\..\eco2\debug_2016\</OutputPath>
<OutputPath>c:\eco2\debug_2016\</OutputPath>
<DocumentationFile>
</DocumentationFile>
<NoWarn>41999,42016,42017,42018,42019,42020,42021,42022,42032,42036,42353,42354,42355</NoWarn>
@@ -113,10 +115,21 @@
</Reference>
<Reference Include="Microsoft.ReportViewer.Common, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<Reference Include="Microsoft.ReportViewer.WinForms, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Microsoft.Web.WebView2.Core, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.Core.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.WinForms, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.WinForms.dll</HintPath>
</Reference>
<Reference Include="Microsoft.Web.WebView2.Wpf, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL">
<HintPath>..\packages\Microsoft.Web.WebView2.1.0.3537.50\lib\net462\Microsoft.Web.WebView2.Wpf.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Drawing" />
<Reference Include="System.IO.Compression" />
<Reference Include="System.IO.Compression.FileSystem" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
@@ -173,6 +186,18 @@
<Compile Include="Forms_Basic\frm_batch.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Basic\Frm_WebManual.Designer.vb">
<DependentUpon>Frm_WebManual.vb</DependentUpon>
</Compile>
<Compile Include="Forms_Basic\Frm_WebManual.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Basic\Frm_WwwrootExtract.Designer.vb">
<DependentUpon>Frm_WwwrootExtract.vb</DependentUpon>
</Compile>
<Compile Include="Forms_Basic\Frm_WwwrootExtract.vb">
<SubType>Form</SubType>
</Compile>
<Compile Include="Forms_Basic\fSelectWeatherGroup.Designer.vb">
<DependentUpon>fSelectWeatherGroup.vb</DependentUpon>
</Compile>
@@ -497,6 +522,12 @@
<EmbeddedResource Include="Forms_Basic\frm_batch.resx">
<DependentUpon>frm_batch.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Basic\Frm_WebManual.resx">
<DependentUpon>Frm_WebManual.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Basic\Frm_WwwrootExtract.resx">
<DependentUpon>Frm_WwwrootExtract.vb</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Forms_Basic\Frm_Work.resx">
<DependentUpon>Frm_Work.vb</DependentUpon>
<SubType>Designer</SubType>
@@ -688,6 +719,9 @@
<None Include="DataSet\DS2.xss">
<DependentUpon>DS2.xsd</DependentUpon>
</None>
<None Include="Template\EBWebView.zip">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="login.dat">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
@@ -702,6 +736,7 @@
</None>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
<None Include="Resources\user_24.png" />
</ItemGroup>
<ItemGroup>
@@ -756,7 +791,7 @@
<ItemGroup>
<BootstrapperPackage Include="Microsoft.Net.Client.3.5">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1 Client Profile</ProductName>
<ProductName>.NET Framework Client Profile</ProductName>
<Install>false</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.2.0">
@@ -789,6 +824,9 @@
<Content Include="icon5.ico" />
<None Include="Resources\select_by_difference.png" />
<None Include="Resources\page_copy.png" />
<Content Include="WebView2Loader.dll">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="단축키.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
@@ -807,6 +845,12 @@
<Content Include="Forms_Input\ReadMe.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<None Include="Template\WebView2Runtime.zip">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="Template\wwwroot.zip">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Include="방위2.png" />
<None Include="방위.png" />
<None Include="방위.jpg" />
@@ -857,6 +901,13 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildBinPath)\Microsoft.VisualBasic.targets" />
<Import Project="..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets" Condition="Exists('..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>이 프로젝트는 이 컴퓨터에 없는 NuGet 패키지를 참조합니다. 해당 패키지를 다운로드하려면 NuGet 패키지 복원을 사용하십시오. 자세한 내용은 http://go.microsoft.com/fwlink/?LinkID=322105를 참조하십시오. 누락된 파일은 {0}입니다.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.Web.WebView2.1.0.3537.50\build\Microsoft.Web.WebView2.targets'))" />
</Target>
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

View File

@@ -0,0 +1,58 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Frm_WebManual
Inherits System.Windows.Forms.Form
'Form은 Dispose를 재정의하여 구성 요소 목록을 정리합니다.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Windows Form 디자이너에 필요합니다.
Private components As System.ComponentModel.IContainer
'참고: 다음 프로시저는 Windows Form 디자이너에 필요합니다.
'수정하려면 Windows Form 디자이너를 사용하십시오.
'코드 편집기에서는 수정하지 마세요.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Dim resources As System.ComponentModel.ComponentResourceManager = New System.ComponentModel.ComponentResourceManager(GetType(Frm_WebManual))
Me.WebView21 = New Microsoft.Web.WebView2.WinForms.WebView2()
CType(Me.WebView21, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'WebView21
'
Me.WebView21.AllowExternalDrop = True
Me.WebView21.CreationProperties = Nothing
Me.WebView21.DefaultBackgroundColor = System.Drawing.Color.White
Me.WebView21.Dock = System.Windows.Forms.DockStyle.Fill
Me.WebView21.Location = New System.Drawing.Point(0, 0)
Me.WebView21.Name = "WebView21"
Me.WebView21.Size = New System.Drawing.Size(1350, 700)
Me.WebView21.TabIndex = 0
Me.WebView21.ZoomFactor = 1.0R
'
'Frm_WebManual
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(7.0!, 12.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(1350, 700)
Me.Controls.Add(Me.WebView21)
Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
Me.Name = "Frm_WebManual"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "사용자 매뉴얼"
CType(Me.WebView21, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
Friend WithEvents WebView21 As Microsoft.Web.WebView2.WinForms.WebView2
End Class

View File

@@ -0,0 +1,140 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAEBAAAAAAIABsAwAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAQAAAAEAgGAAAAH/P/YQAAAzNJ
REFUeJxVk99PHHUUxT8zO7OzC7vsLrsgQtYSaySxoUWk9oFSY1Otxvhg/J0YTXnwwUSJiX+AL/wDRquJ
0fbBVPvSaGJsQ7WKlMYallBMoA0oQmAJS9lld2WYme/3O1+zpjX0Pt6ce+7JPfcYWmv21sjk8BDwLnAY
aAMsoApc16E+/dHQmUt78cZdgpHJ4QbwLPDS8/kTTibeRs1txg1AKg/JBj+tX5RKqstSqle+ePabf/4n
GJkctoGfB3IHBp/OP0nNc/AJWKwZRLXDlhuiZUAcl3V/gqni1KwU8ti5l7+tmneUnO3PPjx4tHOAsgoQ
poGUJrsyikuUsu9Q8uKsVm0eSDzOQEfPwcAXX/+n4L2rp44CVz449JY9K3fwDGhWCXCzrO3Y+MLg5kod
woD7Osq055Z4LNbFh99/qqSQLzYUvH+y84hd8naoI1FhjlaVZu62QaUON5brBE4Fa/8fVLIF5lWRuY0V
Xu09Hgl88U7jcIfzLV3MuEU2YyaPRPYTIlkuBXjeLqkOTa11jMVwG3xNWjosbPqc6O5H+LK3QZBtsppZ
douUfJdk04NsB0kqlZBUm0d7xmVT9VHzb+DoOvXbW5S3m0jEk4hApi2ttWFoCPwamjyWrbj4m8CIJ1hf
lJi6hc62XZL1IWprAo8pRLAEWiOlNCwlw3ItqHVlI2mSsUOsblp4wiYac4i1x/nzry2839MQeqTabdLN
XaQiJSo7VZQMq6YUcvrv8goPNeUpliYJ7TWiER/huQhhEU1kcFpjWDET21BEgk0678+xVFxquDhvikB+
fOHmuNyXaMNy16huXSOT8bGkj21oHDOCFQRk8quk2n/F3L1FX76X0z9eaLzw5+aXz50fC3zxw9jcOE90
9ZGKNJNJhKSiipaoR9L2SccFrdYEZnGZ/gM9XC6MN7aPF0ZnzjVcQPjijV8WZq76u8HBk48e41bJIlLV
SKOOCE1IKPL7uunp7ebK9DUuzV5fAF6/J0zPfHI8KYU8L4V66s3BUxaqA62bMEyDXKrGRnmaz8a+U8AE
8FphdGbjHoK7NTh65AUl1dtKhb2hCjN32o04zwNnCqMzX+0d+BfEDZRfNsnANgAAAABJRU5ErkJggg==
</value>
</data>
</root>

View File

@@ -0,0 +1,89 @@
Imports System.IO
Imports System.Threading.Tasks
Imports Microsoft.Web.WebView2.Core
Public Class Frm_WebManual
Private Async Sub Frm_WebManual_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
' WebView2 초기화
Await InitializeWebView2Async()
Try
' 가상 호스팅 설정
If WebView21.CoreWebView2 Is Nothing Then
Return
End If
' wwwroot 경로 확인
Dim _wwwrootPath As String = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot")
If String.IsNullOrEmpty(_wwwrootPath) Then
_wwwrootPath = Path.Combine(Application.StartupPath, "wwwroot")
End If
' 디렉토리가 없으면 생성
If Not Directory.Exists(_wwwrootPath) Then
Directory.CreateDirectory(_wwwrootPath)
End If
' 가상 호스트 매핑 설정
' https://eco2.local/ -> 로컬 폴더 매핑
WebView21.CoreWebView2.SetVirtualHostNameToFolderMapping(
"eco2.local",
_wwwrootPath,
CoreWebView2HostResourceAccessKind.Allow)
If WebView21 IsNot Nothing AndAlso WebView21.CoreWebView2 IsNot Nothing Then
' 가상 호스트 URL 사용
Dim url As String = "https://eco2.local/index.html"
WebView21.CoreWebView2.Navigate(url)
End If
Catch ex As Exception
MessageBox.Show("웹페이지 이동 중 오류가 발생했습니다: " & ex.Message,
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
Catch ex As Exception
MessageBox.Show("웹페이지 로드 중 오류가 발생했습니다: " & ex.Message,
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
Private Async Function InitializeWebView2Async() As Task
Try
' Fixed Version 경로 설정
Dim fixedVersionPath = Path.Combine(Application.StartupPath, "WebView2Runtime")
Dim userDataFolder = Path.Combine(Application.StartupPath, "WebView2Data")
' Fixed Version이 있는지 확인
If Directory.Exists(fixedVersionPath) Then
' Fixed Version 사용
Dim env = Await CoreWebView2Environment.CreateAsync(fixedVersionPath, userDataFolder)
Await WebView21.EnsureCoreWebView2Async(env)
Else
' 시스템에 설치된 Runtime 사용 (폴백)
Await WebView21.EnsureCoreWebView2Async(Nothing)
End If
Catch ex As Exception
' WebView2 Runtime을 찾을 수 없는 경우
MessageBox.Show(
"WebView2 구성 요소를 찾을 수 없습니다." & vbCrLf & vbCrLf &
"프로그램 설치가 올바르지 않을 수 있습니다." & vbCrLf &
"관리자에게 문의하시기 바랍니다.",
"오류",
MessageBoxButtons.OK,
MessageBoxIcon.Error)
Me.Close()
End Try
End Function
End Class

View File

@@ -0,0 +1,94 @@
<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Frm_WwwrootExtract
Inherits System.Windows.Forms.Form
'Form overrides dispose to clean up the component list.
<System.Diagnostics.DebuggerNonUserCode()> _
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
Try
If disposing AndAlso components IsNot Nothing Then
components.Dispose()
End If
Finally
MyBase.Dispose(disposing)
End Try
End Sub
'Required by the Windows Form Designer
Private components As System.ComponentModel.IContainer
'NOTE: The following procedure is required by the Windows Form Designer
'It can be modified using the Windows Form Designer.
'Do not modify it using the code editor.
<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
Me.lblStatus = New System.Windows.Forms.Label()
Me.progressBar = New System.Windows.Forms.ProgressBar()
Me.lblPercentage = New System.Windows.Forms.Label()
Me.lblTitle = New System.Windows.Forms.Label()
Me.SuspendLayout()
'
'lblStatus
'
Me.lblStatus.AutoSize = True
Me.lblStatus.Location = New System.Drawing.Point(34, 112)
Me.lblStatus.Name = "lblStatus"
Me.lblStatus.Size = New System.Drawing.Size(142, 15)
Me.lblStatus.TabIndex = 0
Me.lblStatus.Text = "압축 해제 준비 중..."
'
'progressBar
'
Me.progressBar.Location = New System.Drawing.Point(34, 138)
Me.progressBar.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
Me.progressBar.Name = "progressBar"
Me.progressBar.Size = New System.Drawing.Size(503, 38)
Me.progressBar.TabIndex = 1
'
'lblPercentage
'
Me.lblPercentage.AutoSize = True
Me.lblPercentage.Font = New System.Drawing.Font("굴림", 9.0!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.lblPercentage.Location = New System.Drawing.Point(34, 188)
Me.lblPercentage.Name = "lblPercentage"
Me.lblPercentage.Size = New System.Drawing.Size(28, 15)
Me.lblPercentage.TabIndex = 2
Me.lblPercentage.Text = "0%"
'
'lblTitle
'
Me.lblTitle.AutoSize = True
Me.lblTitle.Font = New System.Drawing.Font("굴림", 11.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.lblTitle.Location = New System.Drawing.Point(34, 38)
Me.lblTitle.Name = "lblTitle"
Me.lblTitle.Size = New System.Drawing.Size(297, 19)
Me.lblTitle.TabIndex = 3
Me.lblTitle.Text = "런타임 파일 압축 해제 중입니다"
'
'Frm_WwwrootExtract
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 15.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(571, 250)
Me.Controls.Add(Me.lblTitle)
Me.Controls.Add(Me.lblPercentage)
Me.Controls.Add(Me.progressBar)
Me.Controls.Add(Me.lblStatus)
Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog
Me.Margin = New System.Windows.Forms.Padding(3, 4, 3, 4)
Me.MaximizeBox = False
Me.MinimizeBox = False
Me.Name = "Frm_WwwrootExtract"
Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen
Me.Text = "압축 해제 중"
Me.TopMost = True
Me.ResumeLayout(False)
Me.PerformLayout()
End Sub
Friend WithEvents lblStatus As Label
Friend WithEvents progressBar As ProgressBar
Friend WithEvents lblPercentage As Label
Friend WithEvents lblTitle As Label
End Class

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,109 @@
Imports System.IO
Imports System.IO.Compression
Imports System.Threading.Tasks
Public Class Frm_WwwrootExtract
Dim extractPath As String
Dim zipPath As String
Public Sub New(targetpath As String, zipfile As String)
InitializeComponent()
Me.extractPath = targetpath
Me.zipPath = zipfile
End Sub
Private Sub Frm_WwwrootExtract_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Show()
Application.DoEvents()
' 폼이 로드될 때 자동으로 압축 해제 시작
ExtractTemplateFiles()
End Sub
Private Async Sub ExtractTemplateFiles()
Try
' Dim extractPath As String = TargetPath ' Path.Combine(Application.StartupPath, "wwwroot")
' Dim zipPath As String = Path.Combine(extractPath, "wwwroot.zip")
' ZIP 파일 존재 여부 확인
If Not File.Exists(zipPath) Then
lblStatus.Text = "wwwroot.zip 파일을 찾을 수 없습니다."
MessageBox.Show("wwwroot.zip 파일이 존재하지 않습니다.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.DialogResult = DialogResult.Cancel
Me.Close()
Return
End If
' 압축 해제 작업을 별도 Task로 실행
Await Task.Run(Sub()
ExtractZipWithProgress(zipPath, extractPath)
End Sub)
' 완료
lblStatus.Text = "압축 해제 완료!"
lblPercentage.Text = "100%"
progressBar.Value = 100
Application.DoEvents()
' 잠시 대기 후 폼 닫기
Await Task.Delay(500)
Me.DialogResult = DialogResult.OK
Me.Close()
Catch ex As Exception
lblStatus.Text = "오류 발생: " & ex.Message
MessageBox.Show("압축 해제 중 오류가 발생했습니다: " & ex.Message, "오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
Me.DialogResult = DialogResult.Cancel
Me.Close()
End Try
End Sub
Private Sub ExtractZipWithProgress(zipPath As String, extractPath As String)
Using archive As ZipArchive = ZipFile.OpenRead(zipPath)
Dim totalEntries As Integer = archive.Entries.Count
Dim currentEntry As Integer = 0
For Each entry As ZipArchiveEntry In archive.Entries
currentEntry += 1
' UI 업데이트 (UI 스레드에서 실행)
Me.Invoke(Sub()
Dim percentage As Integer = CInt((currentEntry / totalEntries) * 100)
progressBar.Value = percentage
lblPercentage.Text = percentage.ToString() & "%"
lblStatus.Text = $"압축 해제 중... ({currentEntry}/{totalEntries}) {entry.Name}"
Application.DoEvents()
End Sub)
' 전체 경로 생성
Dim destinationPath As String = Path.Combine(extractPath, entry.FullName)
' 디렉토리 항목인 경우
If entry.FullName.EndsWith("/") OrElse entry.FullName.EndsWith("\") Then
Directory.CreateDirectory(destinationPath)
Continue For
End If
' 파일의 디렉토리가 없으면 생성
Dim directoryPath As String = Path.GetDirectoryName(destinationPath)
If Not Directory.Exists(directoryPath) Then
Directory.CreateDirectory(directoryPath)
End If
' 파일 추출
entry.ExtractToFile(destinationPath, True)
Next
End Using
End Sub
Private Sub Frm_WwwrootExtract_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
' 압축 해제가 진행 중일 때는 폼을 닫을 수 없도록 설정 (사용자가 X 버튼을 누른 경우)
If e.CloseReason = CloseReason.UserClosing AndAlso progressBar.Value < 100 Then
e.Cancel = True
MessageBox.Show("압축 해제가 진행 중입니다. 잠시만 기다려 주세요.", "알림", MessageBoxButtons.OK, MessageBoxIcon.Information)
End If
End Sub
End Class

View File

@@ -91,6 +91,7 @@ Partial Class MdiMain
Me.CloseAllToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.ArrangeIconsToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
Me.btcustomprofile = New System.Windows.Forms.ToolStripMenuItem()
Me.btManual = New System.Windows.Forms.ToolStripMenuItem()
Me.TreeView1 = New System.Windows.Forms.TreeView()
Me.ContextMenuStrip1 = New System.Windows.Forms.ContextMenuStrip(Me.components)
Me.그룹추가ToolStripMenuItem = New System.Windows.Forms.ToolStripMenuItem()
@@ -178,7 +179,7 @@ Partial Class MdiMain
'MenuStrip1
'
Me.MenuStrip1.Font = New System.Drawing.Font("돋움", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(129, Byte))
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ReportToolStripMenuItem, Me.건물개요ToolStripMenuItem, Me.환경설정ToolStripMenuItem, Me.bt_계산결과, Me.결과그래프ToolStripMenuItem, Me.정보ToolStripMenuItem1, Me.bt_etc, Me.WindowsMenu, Me.btcustomprofile})
Me.MenuStrip1.Items.AddRange(New System.Windows.Forms.ToolStripItem() {Me.ReportToolStripMenuItem, Me.건물개요ToolStripMenuItem, Me.환경설정ToolStripMenuItem, Me.bt_계산결과, Me.결과그래프ToolStripMenuItem, Me.정보ToolStripMenuItem1, Me.bt_etc, Me.WindowsMenu, Me.btcustomprofile, Me.btManual})
Me.MenuStrip1.Location = New System.Drawing.Point(0, 0)
Me.MenuStrip1.MdiWindowListItem = Me.WindowsMenu
Me.MenuStrip1.Name = "MenuStrip1"
@@ -554,6 +555,14 @@ Partial Class MdiMain
Me.btcustomprofile.Text = "커스텀프로필"
Me.btcustomprofile.Visible = False
'
'btManual
'
Me.btManual.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right
Me.btManual.Image = CType(resources.GetObject("btManual.Image"), System.Drawing.Image)
Me.btManual.Name = "btManual"
Me.btManual.Size = New System.Drawing.Size(69, 20)
Me.btManual.Text = "설명서"
'
'TreeView1
'
Me.TreeView1.ContextMenuStrip = Me.ContextMenuStrip1
@@ -821,5 +830,5 @@ Partial Class MdiMain
Friend WithEvents BatchUpdateProfileToolStripMenuItem As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btcustomprofile As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btMacro2 As System.Windows.Forms.ToolStripMenuItem
Friend WithEvents btManual As ToolStripMenuItem
End Class

View File

@@ -248,6 +248,27 @@
b6AQ75sCVnsVfDHIceuzCVkfYyw4KQ2Mqa8QnWkVq15THp6eXNzdMla0d1nuyiIoVKNTHJMGrFWX2Jhu
IjLRwPp4HeGRGrEaFNQEhh/it1TSde9IOmC327HZbAyVX+Bd6TnxUKYHZ+hVnsKQfwL9/eNoc4/SKT9M
h+wQKpVKnLQN/mV+AQV66PCS6TFTAAAAAElFTkSuQmCC
</value>
</data>
<data name="btManual.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29m
dHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANbSURBVDhPZZPdT1MHHIZ7sd3N7HL7Lxq7uUUzZjYS
nC7olATkcxwXyiD0RMKGWAMBJGpEJhhl0sKGIIWC7FDoh2C/gAO1UqCFQqHUwpA5YGMYN9wyzJ6lZFvQ
Xbx3v+f53byvAlDsjigLcaIsdIqysCjKwm+iLPwhysKaKAu9mqHsj16+3w2+IsrC7Rhw7/s2fOsDOJdG
MIdH6Ak5uBMykOfM3FYPpFlPWVNee0EgysKroizILXNXWN0aJ7wRZHpjAmlxEkt0lpZgkFv+CTr9MnXe
i2RKSYHUzmOv7xa0NYcuEn3qZvaph5nNGSbX/BgWZuiKRqgdX6D6foivBr1IMw7qPFqSWo9YdwSiLLwn
ysKfy7+6MW9auPPEgm1jENujII1z89yYDqOxjKPp81A1ZkG3eJ3xHyUS9QnPD9d/eCwm6LZEb+L7yUL7
pgnjL1686wFqJmeoHptHbR4n126ncFZHUbSSwoiWVn8dt+9fIv5qXH9MsDz1cx8ty3pq1puwbQTxrPsR
+ydRm3x86R0jd6GYxHk1iaEcMqcLKLtXxNBCG+9f2v84JtiKPHFyfq4CzcIZdD+4aF/0kdnxgALHENXh
u2TPGTgYOEOCP59P7KkUdH3GxEov+yv3PVNohrOfPdx0UhoooiBQyzdLdrLaPWT1TJPUMIpoH0UbkNDI
Zj41SqQYz5HbmsbEIxP7yvb+rsh3Za1MrvVQGzzP5YiLyrFhklt8ZEhh0qUIH+u8xF9wEV9l44Sun1Nt
9RQbcnDMtaDSKlcV6oG0Xil0DXO0mdOjVZT7O8hoGyGl3U9y5xLHDWGO3PRw6Eo/KXorOd9WUOs6S6Oz
IiZwKQRzckKmlLQ9vW7hC3sehQ4RjdVJequX9K5FTnY85Oi1QU4am1CbSsitT8MdMcTgv1RaZdpOkVI6
jppq3MX0hRood5+lbMhOvnGUPFOInO5ZsvR28ruz+fzrVBoGKzhnzN35/l8TT9w6vCdRnxC4YDuNZ/U7
mqfcVPSNUGp+QInko6S9nxu+cuzhZrQd6hgcVmmVb74wpkPXP9gTfzXOevDyge2mET1NQ300DjpoGnZi
mupB5y6Lgc9jn1Va5Rv/W+O/OVD1zvF3y9+yvV26d0WlVW79k8cqrdKh0iozXr7/G9y9vOYtj3fFAAAA
AElFTkSuQmCC
</value>
</data>
<metadata name="ContextMenuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
@@ -330,73 +351,73 @@
<data name="ToolStripButton2.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
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
TliMzfocqQAAAABJRU5ErkJggg==
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
WG90MeopAAAAAElFTkSuQmCC
</value>
</data>
<data name="ToolStripButton3.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">

View File

@@ -86,7 +86,8 @@ Public Class MdiMain
Refresh_info()
'// wwwroot 폴더 확인 및 압축 해제
CheckAndExtractWwwroot()
Read_SEtting() '//환경설정을 가져온다. Splah를 변경했따.
Read_FilHistory() '//파일사용내역
@@ -243,6 +244,10 @@ Public Class MdiMain
pLog.Add("Program Start")
' WebView2 Fixed Version 체크
CheckWebView2Runtime()
If Me.bt_etc.Visible = False AndAlso System.Diagnostics.Debugger.IsAttached Then
MsgBox("debugmode import on")
Me.bt_etc.Visible = True
@@ -287,6 +292,59 @@ Public Class MdiMain
End Sub
Private Sub CheckAndExtractWwwroot()
Try
' wwwroot 폴더 경로 확인
Dim templatePath As String = Path.Combine(Application.StartupPath, "Template")
If System.IO.Directory.Exists(templatePath) = False Then Return
Dim zipfiles() As String = System.IO.Directory.GetFiles(templatePath, "*.zip")
If zipfiles.Length = 0 Then Return
'압축파일 이름으로 폴더를 생성해서 압축을 해제한다.
For Each zipfilename As String In zipfiles
Dim nameOnly As String = System.IO.Path.GetFileNameWithoutExtension(zipfilename)
Dim zipcheckfile As String = zipfilename + ".complete"
Dim fi As New System.IO.FileInfo(zipfilename)
Dim completefileinfo As String = fi.LastWriteTime.ToString("yyyyMMddHHmmss.fff") + "|" + fi.Length.ToString()
If System.IO.File.Exists(zipcheckfile) Then
'//해당파일의 날짜와 용량이 내부에 기록되어있다 그정보가 틀리다면 진행을한다.
Dim fileinfo As String = System.IO.File.ReadAllText(zipcheckfile, System.Text.Encoding.UTF8).Trim()
If fileinfo.Equals(completefileinfo) Then
Continue For
End If
End If
Dim targetPath As New DirectoryInfo(Path.Combine(Application.StartupPath, nameOnly))
'//폴더가 존재하지 않는경우 생성
If targetPath.Exists = False Then targetPath.Create()
' 압축 해제 폼 표시
Dim extractForm As New Frm_WwwrootExtract(targetPath.FullName, zipfilename)
extractForm.ShowDialog()
' 압축 해제가 실패한 경우
If extractForm.DialogResult <> DialogResult.OK Then
MessageBox.Show("파일 압축 해제에 실패했습니다." & vbCrLf & "일부 기능이 제한될 수 있습니다.",
"경고", MessageBoxButtons.OK, MessageBoxIcon.Warning)
Else
System.IO.File.WriteAllText(zipcheckfile, completefileinfo, System.Text.Encoding.UTF8)
End If
Next
Catch ex As Exception
' 오류가 발생해도 프로그램은 계속 실행
MessageBox.Show("매뉴얼 파일 확인 중 오류가 발생했습니다: " & ex.Message,
"경고", MessageBoxButtons.OK, MessageBoxIcon.Warning)
End Try
End Sub
Private Sub bt_fileopen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
End Sub
@@ -778,14 +836,14 @@ Public Class MdiMain
If Prj.UIVersion <> CurrentUIVersion() Then
If CInt(Prj.UIVersion.Substring(0, 4)) >= 2016 Then
MsgBox("해당 파일은 현재 프로그램과 동일한 버젼에서 생성된 파일이 아닙니다" + vbCrLf + vbCrLf + _
"파일 Version : " + Prj.UIVersion + vbCrLf + _
"현재 Version : " + CurrentUIVersion() + vbCrLf + vbCrLf + _
MsgBox("해당 파일은 현재 프로그램과 동일한 버젼에서 생성된 파일이 아닙니다" + vbCrLf + vbCrLf +
"파일 Version : " + Prj.UIVersion + vbCrLf +
"현재 Version : " + CurrentUIVersion() + vbCrLf + vbCrLf +
"파일을 생성한 버젼과 결과 혹은 화면이 일치하지 않을 수 있습니다", MsgBoxStyle.Information, "버전확인")
Else
MsgBox("해당 파일은 현재 프로그램과 동일한 버젼에서 생성된 파일이 아닙니다" + vbCrLf + vbCrLf + _
"파일 Version : " + vbCrLf + _
"현재 Version : " + CurrentUIVersion() + vbCrLf + vbCrLf + _
MsgBox("해당 파일은 현재 프로그램과 동일한 버젼에서 생성된 파일이 아닙니다" + vbCrLf + vbCrLf +
"파일 Version : " + vbCrLf +
"현재 Version : " + CurrentUIVersion() + vbCrLf + vbCrLf +
"파일을 생성한 버젼과 결과 혹은 화면이 일치하지 않을 수 있습니다", MsgBoxStyle.Information, "버전확인")
End If
@@ -976,7 +1034,7 @@ Public Class MdiMain
Dim oldfi As New System.IO.FileInfo(FileName)
Dim newfi As New System.IO.FileInfo(bakdi.FullName + "\open_" + oldfi.Name)
If newfi.Exists Then
If MsgBox("백업된 파일이 존재합니다." + vbCrLf + vbCrLf + _
If MsgBox("백업된 파일이 존재합니다." + vbCrLf + vbCrLf +
"백업일자 : " + newfi.CreationTime.ToShortDateString + " " + newfi.CreationTime.ToShortTimeString + vbCrLf + "백업된 파일을 불러오시겠습니까?", MsgBoxStyle.YesNo Or MsgBoxStyle.Question, "확인") = MsgBoxResult.Yes Then
Open_File(newfi.FullName)
End If
@@ -1073,7 +1131,7 @@ Public Class MdiMain
DSET1.tbl_zone.Rows(i - 1)("순실체적") = CSng(면적) * CSng(천장고)
End If
End If
If DSET1.tbl_zone.Rows(i - 1).RowState = DataRowState.Deleted OrElse _
If DSET1.tbl_zone.Rows(i - 1).RowState = DataRowState.Deleted OrElse
DSET1.tbl_zone.Rows(i - 1).RowState = DataRowState.Detached Then
Continue For
End If
@@ -1087,7 +1145,7 @@ Public Class MdiMain
If Not DSET2 Is Nothing Then
For i As Integer = 1 To DSET2.tbl_zone.Rows.Count
If DSET2.tbl_zone.Rows(i - 1).RowState = DataRowState.Deleted OrElse _
If DSET2.tbl_zone.Rows(i - 1).RowState = DataRowState.Deleted OrElse
DSET2.tbl_zone.Rows(i - 1).RowState = DataRowState.Detached Then
Continue For
End If
@@ -1102,7 +1160,7 @@ Public Class MdiMain
'//입력면
If Not DSET1 Is Nothing Then
For i As Integer = 1 To DSET1.tbl_myoun.Rows.Count
If DSET1.tbl_myoun.Rows(i - 1).RowState = DataRowState.Deleted OrElse _
If DSET1.tbl_myoun.Rows(i - 1).RowState = DataRowState.Deleted OrElse
DSET1.tbl_myoun.Rows(i - 1).RowState = DataRowState.Detached Then
Continue For
End If
@@ -1121,7 +1179,7 @@ Public Class MdiMain
If Not DSET2 Is Nothing Then
For i As Integer = 1 To DSET2.tbl_myoun.Rows.Count
If DSET2.tbl_myoun.Rows(i - 1).RowState = DataRowState.Deleted OrElse _
If DSET2.tbl_myoun.Rows(i - 1).RowState = DataRowState.Deleted OrElse
DSET2.tbl_myoun.Rows(i - 1).RowState = DataRowState.Detached Then
Continue For
End If
@@ -2009,8 +2067,8 @@ Public Class MdiMain
'MsgBox(autoselecttagname)
'//추가할메뉴선택
Dim Menus() As String = New String() {"입력존", "공조처리", _
"난방기기", "난방공급시스템", "난방분배시스템", "냉방기기", _
Dim Menus() As String = New String() {"입력존", "공조처리",
"난방기기", "난방공급시스템", "난방분배시스템", "냉방기기",
"냉방분배시스템", "신재생및열병합", "열관류율", "월별에너지사용량"}
For Each m As String In Menus
@@ -2684,8 +2742,8 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
Private Sub ToolStripMenuItem13_Click(sender As System.Object, e As System.EventArgs) Handles ToolStripMenuItem13.Click
If MsgBox("정말로 서버의 데이터를 수정하시겠습니까?" & vbCrLf & _
"서버의 기상데이터가 삭제되고 현재데이터가 씌여집니다." & vbCrLf & _
If MsgBox("정말로 서버의 데이터를 수정하시겠습니까?" & vbCrLf &
"서버의 기상데이터가 삭제되고 현재데이터가 씌여집니다." & vbCrLf &
"이작업은 되돌릴 수없습니다", MsgBoxStyle.Information Or MsgBoxStyle.OkCancel, "확인") <> MsgBoxResult.Ok Then Return
Dim pass As String = InputBox("암호입력")
@@ -2719,11 +2777,11 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
Rcnt += Ta2.Insert(Dr.pcode, Dr.code, Dr.설명, Dr.최대부하, Dr.m01, Dr.m02, Dr.m03, Dr.m04, Dr.m05, Dr.m06, Dr.m07, Dr.m08, Dr.m09, Dr.m10, Dr.m11, Dr.m12)
Next
For Each Dr As DS.weather_supdoRow In DSET1.weather_supdo.Rows
Rcnt += Ta3.Insert(Dr.pcode, Dr.code, Dr.설명, Dr.t01, Dr.t02, Dr.t03, Dr.t04, Dr.t05, Dr.t06, Dr.t07, Dr.t08, Dr.t09, Dr.t10, _
Rcnt += Ta3.Insert(Dr.pcode, Dr.code, Dr.설명, Dr.t01, Dr.t02, Dr.t03, Dr.t04, Dr.t05, Dr.t06, Dr.t07, Dr.t08, Dr.t09, Dr.t10,
Dr.t11, Dr.t12, Dr.t13, Dr.t14, Dr.t15, Dr.t16, Dr.t17, Dr.t18, Dr.t19, Dr.t20, Dr.t21, Dr.t22, Dr.t23, Dr.t24)
Next
For Each Dr As DS.weather_tempRow In DSET1.weather_temp.Rows
Rcnt += Ta4.Insert(Dr.pcode, Dr.code, Dr.설명, Dr.t01, Dr.t02, Dr.t03, Dr.t04, Dr.t05, Dr.t06, Dr.t07, Dr.t08, Dr.t09, Dr.t10, _
Rcnt += Ta4.Insert(Dr.pcode, Dr.code, Dr.설명, Dr.t01, Dr.t02, Dr.t03, Dr.t04, Dr.t05, Dr.t06, Dr.t07, Dr.t08, Dr.t09, Dr.t10,
Dr.t11, Dr.t12, Dr.t13, Dr.t14, Dr.t15, Dr.t16, Dr.t17, Dr.t18, Dr.t19, Dr.t20, Dr.t21, Dr.t22, Dr.t23, Dr.t24)
Next
MsgBox("업데이트완료", MsgBoxStyle.Information, "확인")
@@ -3876,8 +3934,8 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
End If
content.Append(vbTab + drm.설명 + vbTab + drm.건축부위방식 + vbTab + _
drm.건축부위면적 + vbTab + _
content.Append(vbTab + drm.설명 + vbTab + drm.건축부위방식 + vbTab +
drm.건축부위면적 + vbTab +
열관류율 + vbTab + drm.방위)
Next
content.AppendLine()
@@ -3961,4 +4019,43 @@ ENDSTAT: '//오류발생시 강제종료를 위한 분기문
Dim f As New Frm_Macro2
f.Show()
End Sub
Dim frmManual As Frm_WebManual = Nothing
Private Sub ManualToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles btManual.Click
Try
If frmManual Is Nothing OrElse frmManual.IsDisposed Then
frmManual = New Frm_WebManual()
End If
If frmManual.WindowState = FormWindowState.Minimized Then
frmManual.WindowState = FormWindowState.Normal
End If
frmManual.Show()
frmManual.Activate()
Catch ex As Exception
MessageBox.Show("매뉴얼 표시 중 오류가 발생했습니다: " & ex.Message,
"오류", MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try
End Sub
''' <summary>
''' WebView2 Fixed Version 런타임 체크
''' </summary>
Private Sub CheckWebView2Runtime()
Try
Dim fixedVersionPath = Path.Combine(Application.StartupPath, "WebView2Runtime")
' Fixed Version 폴더가 없으면 경고 (하지만 계속 실행)
If Not Directory.Exists(fixedVersionPath) Then
Debug.WriteLine("경고: WebView2 Fixed Version을 찾을 수 없습니다. Manual 기능이 제한될 수 있습니다.")
' 사용자에게는 Manual 메뉴를 클릭할 때만 알림
End If
Catch ex As Exception
Debug.WriteLine("WebView2 체크 중 오류: " & ex.Message)
End Try
End Sub
End Class

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -29,7 +29,7 @@
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><userSettings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup><userSettings>
<Eco2Ar.My.MySettings>
<setting name="xmlformat" serializeAs="String">
<value>&lt;?xml version="1.0" standalone="yes"?&gt;

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Microsoft.Web.WebView2" version="1.0.3537.50" targetFramework="net48" />
</packages>

View File

@@ -36,7 +36,7 @@
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -25,4 +25,4 @@
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/></startup></configuration>

381
CLAUDE.md Normal file
View File

@@ -0,0 +1,381 @@
# CLAUDE.md
이 파일은 Claude Code (claude.ai/code)가 이 저장소에서 작업할 때 참고할 가이드를 제공합니다.
## 프로젝트 개요
**ECO2 (Energy Calculation Optimization 2)**는 한국 건축물 에너지효율등급 인증 기준(녹색건축인증)에 따라 건물의 1차 에너지 소요량, CO2 배출량, 신재생에너지 생산량을 계산하는 VB.NET 및 WinForms 기반 응용 프로그램입니다.
**주 언어**: Visual Basic .NET (VB.NET) with .NET Framework 4.0
**추가 언어**: C# (유틸리티 라이브러리만)
**플랫폼**: Windows 데스크톱 응용 프로그램 (x86 타겟)
## 솔루션 구조
솔루션 `ArinWareT4.sln`은 모듈화된 아키텍처로 구성된 6개의 프로젝트를 포함합니다:
### 메인 응용 프로그램
- **ECO2_2025V1** (`ArinWarev1/`) - 주 WinForms 응용 프로그램
- 진입점: `MdiMain.vb` - 메뉴 시스템을 갖춘 MDI 부모 폼
- `Calculator/` 하위 디렉토리의 핵심 계산 엔진
- 기능별 폼 구성: `Forms/`, `Forms_Input/`, `Forms_Report/`, `Forms_Basic/`
- `Data/`의 기상 데이터 (XML 형식)
- 타입 데이터셋: `eco2DataSet.xsd` (데이터 모델링용)
### 지원 라이브러리 (SubProject 폴더 그룹)
- **CEnergy** (`CEnergy/ArinClassV2/`) - 핵심 비즈니스 로직 라이브러리
- 공통 유틸리티, 데이터베이스 액세스, INI 파일 처리
- 여러 프로젝트에서 공유
- **ArinNet** - 네트워크 통신 유틸리티
- **ArinLogin** - 인증 및 사용자 관리
- 라이선스 검증, 암호화/복호화
- **ArinLog** - 로깅 기능
- **Utility** (C#) - 압축 유틸리티
- 데이터 압축을 위한 MiniLZO 구현
### 배포
- **Setup1** - 설치 프로그램 프로젝트 (`.vdproj`)
## 빌드 및 실행
### 솔루션 빌드
```bash
# Visual Studio에서 솔루션 열기
start ArinWareT4.sln
# 명령줄에서 빌드 (Visual Studio 필요)
msbuild ArinWareT4.sln /p:Configuration=Debug /p:Platform="Any CPU"
msbuild ArinWareT4.sln /p:Configuration=Release /p:Platform="Any CPU"
```
### 출력 경로
- **Debug**: `..\..\..\..\..\eco2\debug_2016\` (프로젝트 기준 상대 경로)
- **Release**: `c:\eco2\debug_2016\`
### 플랫폼 설정
- 타겟 플랫폼: **x86** (32비트)
- 프레임워크: **.NET Framework 4.0**
- Option Strict: **Off** (VB.NET 특성)
### 빌드 구성
- Debug / Release (표준)
- CD_ROM / DVD-5 / SingleImage (배포 구성)
## 아키텍처 개요
### 계산 엔진 (`ArinWarev1/Calculator/`)
계산 엔진은 건물 에너지 계산을 수행하는 전문 모듈로 구성됩니다:
**핵심 계산기 클래스**:
- `Calculator.vb` - 모든 계산 모듈을 조율하는 메인 오케스트레이터
- `CZone.vb` - 존 레벨 계산 (열존, 난방/냉방 부하)
- `CAirHandling.vb` - 공조 시스템 계산
- `CHeating.vb` - 난방 시스템 계산 (기기, 분배, 공급)
- `CCooling.vb` - 냉방 시스템 계산 (기기, 분배)
- `CRenewable.vb` - 신재생에너지 생산량 계산
- `CSummary.vb` - 결과 집계 및 요약 생성
- `CShared.vb` - 공유 계산 변수 및 유틸리티
**결과 처리** (`Calculator/Result/`):
- `CResult.vb` - 결과 데이터 구조
- `C1차소요량.vb` - 1차 에너지 소요량 계산
- `CCo2발생량.vb` - CO2 배출량 계산
- `C생산에너지.vb` - 에너지 생산량 계산
- `C사용면적.vb` - 사용 면적 계산
- `CZones.vb` - 존 결과 집계
### 데이터 흐름
```
사용자 입력 폼 (Forms_Input/)
DataSet (eco2DataSet - DS, DSR)
계산 엔진 (Calculator)
결과 클래스 (CResult, DSR)
리포트 폼 (Forms_Report/)
```
### 주요 데이터셋
- `DS` (DSET) - 입력 데이터 (사용자 입력 건물 정보)
- `DSR` (DSETR) - 결과 데이터 (계산된 에너지 값)
- `CResult` - 구조화된 계산 결과
### 폼 구성
**Forms_Input/** - 데이터 입력 폼
- `Frm_Desc.vb` - 건물 개요
- `Frm_kongjo.vb` - 공조 처리 입력
- `Frm_Bunbae.vb` - 분배 시스템 입력
- `Frm_custom_profile.vb` - 커스텀 사용 프로파일
**Forms_Report/** - 출력 및 보고
- `Frm_Upload.vb` - 인증 서버 업로드
- `Frm_Macro.vb`, `Frm_Macro2.vb` - Excel 리포트 생성
- `Frm_Export.vb` - 데이터 내보내기 기능
**Forms_Basic/** - 유틸리티 폼
- `Frm_Calc.vb` - 계산 트리거
- `Frm_Filter.vb` - 데이터 필터링
- `Frm_FileInfo.vb` - 파일 메타데이터
**Forms/** - 일반 응용 프로그램 폼
- `Frm_About.vb` - About 대화상자
- `Frm_Common.vb` - 공통 대화상자
### 메뉴 시스템 (MdiMain.vb)
`E_MenuIdx` 열거형에 정의된 메뉴 인덱스:
- 입력존
- 입력면
- 공조처리
- 난방기기/공급/분배
- 냉방기기/분배
- 신재생및열병합
- 열관류율
- 건물개요
- 월별에너지사용량
### 사용자 권한
`Prj.UserAuthType`을 통해 제어되는 사용자 유형:
- `ADMIN` - 전체 액세스
- `BOTH` - 전문 사용자 (계산 + 인증)
- `BOTH0` - 일반 사용자 (제한된 액세스)
- `BOTH1` - 확장 전문 사용자 액세스
## 외부 종속성
### FarPoint Spread (v5.0.3505.2008)
- 데이터 입력을 위한 Excel 형식의 스프레드시트 컨트롤
- 구성 요소: CalcEngine, Excel, PDF, Win, Chart
- 입력 폼에서 광범위하게 사용
### Microsoft ReportViewer
- `Microsoft.ReportViewer.Common.dll`
- `Microsoft.ReportViewer.WinForms.dll`
- 형식화된 보고서 생성에 사용
### Excel Interop
- `Interop.Excel.dll` - Excel 자동화를 위한 COM interop
- 매크로/내보내기 기능에 사용
### LOV 구성 요소
- `Lov.dll` - 값 목록 컨트롤 라이브러리
## 파일 형식 및 데이터 저장
### 프로젝트 파일 (.tpl 파일)
- LZO 압축 바이너리 형식 (Utility 프로젝트 사용)
- 건물 데이터, 계산 입력값, 결과 포함
- 사용자 지정 위치에 저장
- 최근 파일은 응용 프로그램 설정에서 추적
### 기상 데이터 (Data/*.xml)
- `weather_temp.xml` - 온도 데이터
- `weather_supdo.xml` - 습도 데이터
- `weather_ilsa.xml` - 일사량 데이터
- `weather_group.xml` - 기상 관측소 그룹
- `tbl_weather.xml` - 기상 위치 테이블
### 구성 파일
- `Frm_Setting.ini` - UI 상태 지속성 (창 크기, 위치)
- `login.dat` - 사용자 자격 증명 (암호화됨)
- `app.config` - 응용 프로그램 설정
## 한국 건축물 에너지 기준
이 응용 프로그램은 한국 건축물 에너지효율등급 인증 기준을 구현합니다:
### 주요 용어
- 건물개요
- 1차 에너지 소요량
- CO2 발생량
- 난방 / 냉방
- 급탕
- 조명 / 환기
- 신재생에너지
- 열관류율
- 공조
- 용도지역
### 계산 버전 관리
`StartVersion` 상수를 통한 버전 제어:
- 규제 준수를 위한 계산 엔진 버전 관리
- `Calculator.New()` 생성자에서 버전 확인
- 기준 버전 "2009123100"
## 개발 가이드라인
### VB.NET 규칙
- Option Strict는 OFF - 암시적 형식 변환 허용
- 한글 주석 및 변수명은 표준 관행
- 명명: 클래스, 메서드는 PascalCase; 로컬 변수는 엄격한 규칙 없음
### DataSet 사용
- 항상 타입 데이터셋 (`DS`, `DSR`) 사용
- 모듈 수준 변수 `DSET1`, `DSETR1`을 통해 액세스
- 타입 안전 액세스를 위해 DataRow 객체 사용
### 폼 관리
- `MdiMain`을 통한 MDI 자식 폼 관리
- `OpenedForm` 속성을 통해 열린 폼 추적
- `Prj.Opened`를 사용하여 프로젝트 파일 로드 여부 확인
### 계산 흐름
1. 프로젝트 파일 로드 → `DSET` 채우기
2. 사용자가 입력 폼 수정 → `DSET` 업데이트
3. 계산 트리거 → `Calculator` 클래스가 `DSET` 처리 → `DSETR``CResult` 채우기
4. 리포트 폼에 결과 표시
### 파일 작업
- 항상 MdiMain의 `Save_File()` / `Load_File()` 메서드 사용
- Utility 라이브러리를 통한 파일 압축 처리
- `PrjChanged` 플래그를 통한 파일 변경 추적
## 일반 작업
### 계산 실행
계산은 메뉴 또는 폼 버튼에서 트리거되고 `Calculator` 클래스를 통해 처리됩니다:
```vb
' 데이터셋 및 결과 객체로 계산기 초기화
Dim calc As New Calculator(version, DSET1, DSETR1, Result2, isSimulation)
' 초기화 오류 확인
If calc.IsError Then
' 오류 처리
Return
End If
' DSETR1 및 Result2에서 계산 결과 사용 가능
```
### 새 입력 필드 추가
1. 적절한 테이블에 열을 추가하도록 `eco2DataSet.xsd` 수정
2. 해당 입력 폼(`Forms_Input/*.vb`) 업데이트
3. 관련 `Calculator/*.vb` 클래스의 계산 로직 업데이트
4. 필요한 경우 리포트 폼 업데이트
### 새 계산 모듈 추가
1. `Calculator/` 디렉토리에 새 클래스 생성
2. 기존 모듈의 계산 패턴 상속
3. 생성자에서 `DS`, `DSR`, `CResult` 수락
4. `Calculator.vb` 오케스트레이터에 연결
5. `CSummary.vb`의 요약 집계 업데이트
### FarPoint Spread 컨트롤 작업
FarPoint 컨트롤은 그리드 기반 입력에 광범위하게 사용됩니다:
```vb
' Spread 컨트롤 액세스
Dim spread As FarPoint.Win.Spread.FpSpread = Me.FpSpread1
' 셀 값 설정
spread.ActiveSheet.Cells(row, col).Value = value
' 셀 값 읽기
Dim value = spread.ActiveSheet.Cells(row, col).Value
' 셀 속성 설정
spread.ActiveSheet.Cells(row, col).BackColor = Color.Yellow
```
## 알려진 패턴 및 규칙
### 전역 모듈 변수
- `DSET1` - 전역 입력 데이터셋 (DS 타입)
- `DSETR1` - 전역 결과 데이터셋 (DSR 타입)
- `Result2` - 전역 결과 객체 (CResult 타입)
- `Prj` - 전역 프로젝트 상태 객체
- `CLang` - 언어/지역화 문자열
### 오류 처리
- 계산 클래스의 `IsError` 속성 패턴
- 사용자 대면 오류에 대한 메시지 박스
- `On Error Resume Next`를 사용한 VB.NET 오류 처리 (레거시 패턴)
### 이벤트 처리
- 클래스 수준 이벤트 핸들러를 위한 WithEvents 패턴
- `Handles` 키워드를 통한 폼 이벤트 처리
### INI 파일 액세스
```vb
Dim ini As New MyINI(filePath)
Dim value = ini.Read(section, key, defaultValue)
ini.Write(section, key, value)
```
## 테스트 및 디버깅
### 디버그 모드
- Debug 구성으로 빌드
- 로컬 디버그 폴더로 출력
- 전체 심볼 정보 사용 가능
### 테스트 데이터
사용 가능한 샘플 프로젝트 파일:
- `sample.tpl` - 표준 샘플 건물
- `sample_0307.tpl` - 대체 샘플
- `sample_200.tpl` - 대형 건물 샘플
### 로깅
응용 프로그램 로깅에 ArinLog 라이브러리 사용:
```vb
pLog.Add("이벤트 설명", includeStackTrace)
```
## 언어 관련 참고사항
응용 프로그램은 한국 사용자를 위해 설계되었습니다:
- 모든 UI 텍스트는 한글
- 사용자 문서는 한글
- 한국 건축 기준 및 용어
- 날짜/시간 형식: 한국 표준
- 인코딩: 소스 파일은 UTF-8
주석 및 변수명은 한글과 영어를 혼용합니다 - 이는 의도적이며 이 코드베이스의 표준입니다.
## 배포 참고사항
### 설치
- 설치 프로그램 프로젝트: `Setup1/Setup1.vdproj`
- 메인 프로젝트에 구성된 ClickOnce 배포
- 게시 URL: `ftp://tindevil.com/www/mynetapp/t4/`
- 설치 URL: `http://tindevil.com/mynetapp/t4/`
### 버전 관리
- AssemblyInfo의 버전 정보
- ArinLogin 라이브러리를 통한 버전 확인
- 서버 측 버전 검증
### 업데이트
- 시작 시 업데이트 확인
- Foreground 업데이트 모드 (실행 전 업데이트)
- 7일 업데이트 간격 구성
## 보안 참고사항
### 인증
- ArinLogin 라이브러리를 통한 사용자 인증
- MAC 주소 검증 (상태 표시줄의 `lbl_mac`)
- 라이선스 관리 시스템
- `login.dat`의 암호화된 자격 증명
### 데이터 보호
- 데이터 보호를 위한 파일 압축
- ArinLogin.EnDec 클래스를 통한 암호화/복호화
- 라이선스 준수를 위한 네트워크 검증

File diff suppressed because it is too large Load Diff

View File

@@ -21,8 +21,20 @@
}
"Entry"
{
"MsmKey" = "8:_1B82797EE76C4687B40F102FB1C3656C"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_26069AE042094C99B6D68EFBF0407E39"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -45,12 +57,42 @@
}
"Entry"
{
"MsmKey" = "8:_3A96F072BA7F90374AF5E6A6BCC34084"
"OwnerKey" = "8:_55C7A65939B117D312DD5A518DF4B270"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3B45869800BE418CB04B7AAE60ECC4C3"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3BE85EAE54344746B9CBC3B7045AB889"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3E4ACF51547513CA033A352F53714D81"
"OwnerKey" = "8:_5C78790BE844478C9C716929BE45A267"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3E4ACF51547513CA033A352F53714D81"
"OwnerKey" = "8:_D541DEE33C7640AC935C339497D767B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3E4ACF51547513CA033A352F53714D81"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_3F3FFE1FF99E4444B306BE60F3FB6997"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -58,7 +100,7 @@
"Entry"
{
"MsmKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -70,7 +112,7 @@
"Entry"
{
"MsmKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -87,12 +129,24 @@
}
"Entry"
{
"MsmKey" = "8:_55C7A65939B117D312DD5A518DF4B270"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"OwnerKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_5C78790BE844478C9C716929BE45A267"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_5D29234F4F444C9AAE7845416706303D"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -105,6 +159,12 @@
}
"Entry"
{
"MsmKey" = "8:_6913B5242057436886DF5DB3C58CEB55"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_691C9DA50302E0464D0E64E97C1242A2"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
@@ -118,7 +178,7 @@
"Entry"
{
"MsmKey" = "8:_6BB2F49C9D04D801E8DE021D6CE20C22"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -129,6 +189,12 @@
}
"Entry"
{
"MsmKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
@@ -136,13 +202,13 @@
"Entry"
{
"MsmKey" = "8:_8BDE3E37C576268C85BFD64B9B0E7E24"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_8EC9C4E69441F73892A4C676310B7ABE"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -159,6 +225,12 @@
}
"Entry"
{
"MsmKey" = "8:_A9C68AB7DD5240D09E2D51CD42992DB2"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_AD951B42EF214BF0882807B6B1358B02"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
@@ -166,7 +238,7 @@
"Entry"
{
"MsmKey" = "8:_ADE6E41741BD7CD14907A44E54816E0D"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -184,7 +256,13 @@
"Entry"
{
"MsmKey" = "8:_CE47408D9D1AC3C1A1C987DBD7CA7F43"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_D541DEE33C7640AC935C339497D767B6"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -195,14 +273,8 @@
}
"Entry"
{
"MsmKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_E5FD918B4BE4C70000A151506717226F"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -225,38 +297,14 @@
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"MsmKey" = "8:_FE8E361859744E078E1D240184E37E6C"
"OwnerKey" = "8:_UNDEFINED"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_36E293D174759AFAAD42CF70AA63402C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_ECC375834F59CEFC1D106FE35A78C9C5"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"OwnerKey" = "8:_E5FD918B4BE4C70000A151506717226F"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -268,19 +316,13 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_691C9DA50302E0464D0E64E97C1242A2"
"OwnerKey" = "8:_ECC375834F59CEFC1D106FE35A78C9C5"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"OwnerKey" = "8:_D541DEE33C7640AC935C339497D767B6"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -292,7 +334,13 @@
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_E5FD918B4BE4C70000A151506717226F"
"OwnerKey" = "8:_88E9E9750BBC8DE9EFD32EE0994A73F2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_85623F2834184CA2A083635A5BAE18C9"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
@@ -325,6 +373,66 @@
"OwnerKey" = "8:_CE47408D9D1AC3C1A1C987DBD7CA7F43"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_691C9DA50302E0464D0E64E97C1242A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_5C78790BE844478C9C716929BE45A267"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_3E4ACF51547513CA033A352F53714D81"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_59B3512FD7C9D2430BF7B3C6379B9C9D"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_55C7A65939B117D312DD5A518DF4B270"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4B290A29E53110D5B83008A4DD0873A2"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_4608D921DC658CD173C039AF16C5E283"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_3A96F072BA7F90374AF5E6A6BCC34084"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_36E293D174759AFAAD42CF70AA63402C"
"MsmSig" = "8:_UNDEFINED"
}
"Entry"
{
"MsmKey" = "8:_UNDEFINED"
"OwnerKey" = "8:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
"MsmSig" = "8:_UNDEFINED"
}
}
"Configurations"
{
@@ -352,10 +460,10 @@
"ComponentsUrl" = "8:"
"Items"
{
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.0"
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:.NETFramework,Version=v4.8"
{
"Name" = "8:Microsoft .NET Framework 4(x86 및 x64)"
"ProductCode" = "8:.NETFramework,Version=v4.0"
"Name" = "8:Microsoft .NET Framework 4.8(x86 및 x64)"
"ProductCode" = "8:.NETFramework,Version=v4.8"
}
"{EDC2488A-8267-493A-A98E-7D9C3B36CDF3}:Microsoft.ReportViewer.10.0"
{
@@ -432,7 +540,7 @@
{
"Name" = "8:.NET Framework"
"Message" = "8:[VSDNETMSG]"
"FrameworkVersion" = "8:.NETFramework,Version=v4.0,Profile=Client"
"FrameworkVersion" = "8:.NETFramework,Version=v4.8"
"AllowLaterVersions" = "11:FALSE"
"InstallUrl" = "8:http://go.microsoft.com/fwlink/?LinkId=131000"
}
@@ -460,6 +568,46 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_1B82797EE76C4687B40F102FB1C3656C"
{
"SourcePath" = "8:..\\ArinWarev1\\Template\\EBWebView.zip"
"TargetName" = "8:EBWebView.zip"
"Tag" = "8:"
"Folder" = "8:_957C6D0C8FC44AC0B56EA59602B3F5E3"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_26069AE042094C99B6D68EFBF0407E39"
{
"SourcePath" = "8:..\\ArinWarev1\\Template\\Sample.tpl"
"TargetName" = "8:Sample.tpl"
"Tag" = "8:"
"Folder" = "8:_957C6D0C8FC44AC0B56EA59602B3F5E3"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_29FE169CCEBDEB4C07246AF3E1D7D1EF"
{
"AssemblyRegister" = "3:1"
@@ -562,6 +710,57 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3A96F072BA7F90374AF5E6A6BCC34084"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:TRUE"
"AssemblyAsmDisplayName" = "8:System.IO.Compression, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_3A96F072BA7F90374AF5E6A6BCC34084"
{
"Name" = "8:System.IO.Compression.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:System.IO.Compression.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3B45869800BE418CB04B7AAE60ECC4C3"
{
"SourcePath" = "8:..\\ArinWarev1\\Template\\Sample"
"TargetName" = "8:Sample"
"Tag" = "8:"
"Folder" = "8:_957C6D0C8FC44AC0B56EA59602B3F5E3"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3BE85EAE54344746B9CBC3B7045AB889"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_river.dat"
@@ -582,6 +781,37 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_3E4ACF51547513CA033A352F53714D81"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Microsoft.Web.WebView2.Core, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_3E4ACF51547513CA033A352F53714D81"
{
"Name" = "8:Microsoft.Web.WebView2.Core.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:Microsoft.Web.WebView2.Core.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_3F3FFE1FF99E4444B306BE60F3FB6997"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_wind.dat"
@@ -664,6 +894,37 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_55C7A65939B117D312DD5A518DF4B270"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:TRUE"
"AssemblyAsmDisplayName" = "8:System.IO.Compression.FileSystem, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_55C7A65939B117D312DD5A518DF4B270"
{
"Name" = "8:System.IO.Compression.FileSystem.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:System.IO.Compression.FileSystem.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_59B3512FD7C9D2430BF7B3C6379B9C9D"
{
"AssemblyRegister" = "3:1"
@@ -695,6 +956,37 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_5C78790BE844478C9C716929BE45A267"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Microsoft.Web.WebView2.Wpf, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_5C78790BE844478C9C716929BE45A267"
{
"Name" = "8:Microsoft.Web.WebView2.Wpf.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\eco2\\debug_2016\\Microsoft.Web.WebView2.Wpf.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_5D29234F4F444C9AAE7845416706303D"
{
"SourcePath" = "8:..\\ArinWarev1\\002.ico"
@@ -735,6 +1027,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_6913B5242057436886DF5DB3C58CEB55"
{
"SourcePath" = "8:..\\ArinWarev1\\Template\\WebView2Runtime.zip"
"TargetName" = "8:WebView2Runtime.zip"
"Tag" = "8:"
"Folder" = "8:_957C6D0C8FC44AC0B56EA59602B3F5E3"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_691C9DA50302E0464D0E64E97C1242A2"
{
"AssemblyRegister" = "3:1"
@@ -795,11 +1107,11 @@
{
"_6BB2F49C9D04D801E8DE021D6CE20C22"
{
"Name" = "8:Utility.DLL"
"Name" = "8:Utility.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:Utility.DLL"
"SourcePath" = "8:Utility.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
@@ -837,6 +1149,37 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_85623F2834184CA2A083635A5BAE18C9"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Eco2Ar, Version=1.2017.122.1014, Culture=neutral, processorArchitecture=x86"
"ScatterAssemblies"
{
"_85623F2834184CA2A083635A5BAE18C9"
{
"Name" = "8:Eco2Ar.exe"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\eco2\\dotfus_2016\\Eco2Ar.exe"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_88E9E9750BBC8DE9EFD32EE0994A73F2"
{
"AssemblyRegister" = "3:1"
@@ -877,11 +1220,11 @@
{
"_8BDE3E37C576268C85BFD64B9B0E7E24"
{
"Name" = "8:CEnergy.DLL"
"Name" = "8:CEnergy.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:CEnergy.DLL"
"SourcePath" = "8:CEnergy.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
@@ -908,11 +1251,11 @@
{
"_8EC9C4E69441F73892A4C676310B7ABE"
{
"Name" = "8:ArinNet.DLL"
"Name" = "8:ArinNet.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:ArinNet.DLL"
"SourcePath" = "8:ArinNet.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
@@ -970,6 +1313,26 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_A9C68AB7DD5240D09E2D51CD42992DB2"
{
"SourcePath" = "8:C:\\eco2\\debug_2016\\WebView2Loader.dll"
"TargetName" = "8:WebView2Loader.dll"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_AD951B42EF214BF0882807B6B1358B02"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\Data\\weather_supdo.dat"
@@ -999,11 +1362,11 @@
{
"_ADE6E41741BD7CD14907A44E54816E0D"
{
"Name" = "8:ArinLogin.DLL"
"Name" = "8:ArinLogin.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:ArinLogin.DLL"
"SourcePath" = "8:ArinLogin.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
@@ -1081,11 +1444,11 @@
{
"_CE47408D9D1AC3C1A1C987DBD7CA7F43"
{
"Name" = "8:ArinLog.Net4.DLL"
"Name" = "8:ArinLog.Net4.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:ArinLog.Net4.DLL"
"SourcePath" = "8:ArinLog.Net4.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
@@ -1103,10 +1466,21 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DCE4D26697134EE9B82046F012AA016E"
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_D541DEE33C7640AC935C339497D767B6"
{
"SourcePath" = "8:C:\\ECO2\\debug_2016\\upload.xlsx"
"TargetName" = "8:upload.xlsx"
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Microsoft.Web.WebView2.WinForms, Version=1.0.3537.50, Culture=neutral, PublicKeyToken=2a8ab48044d2601e, processorArchitecture=MSIL"
"ScatterAssemblies"
{
"_D541DEE33C7640AC935C339497D767B6"
{
"Name" = "8:Microsoft.Web.WebView2.WinForms.dll"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\eco2\\debug_2016\\Microsoft.Web.WebView2.WinForms.dll"
"TargetName" = "8:"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
@@ -1123,21 +1497,10 @@
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
"{9F6F8455-1EF1-4B85-886A-4223BCC8E7F7}:_DF16200C7C9B40998C022F2E37D1E143"
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_DCE4D26697134EE9B82046F012AA016E"
{
"AssemblyRegister" = "3:1"
"AssemblyIsInGAC" = "11:FALSE"
"AssemblyAsmDisplayName" = "8:Eco2Ar, Version=1.2017.122.1014, Culture=neutral, processorArchitecture=x86"
"ScatterAssemblies"
{
"_DF16200C7C9B40998C022F2E37D1E143"
{
"Name" = "8:Eco2Ar.exe"
"Attributes" = "3:512"
}
}
"SourcePath" = "8:C:\\ECO2\\dotfus_2016\\Eco2Ar.exe"
"TargetName" = "8:"
"SourcePath" = "8:C:\\ECO2\\debug_2016\\upload.xlsx"
"TargetName" = "8:upload.xlsx"
"Tag" = "8:"
"Folder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Condition" = "8:"
@@ -1247,6 +1610,26 @@
"IsDependency" = "11:TRUE"
"IsolateTo" = "8:"
}
"{1FB2D0AE-D3B9-43D4-B9DD-F88EC61E35DE}:_FE8E361859744E078E1D240184E37E6C"
{
"SourcePath" = "8:..\\ArinWarev1\\Template\\wwwroot.zip"
"TargetName" = "8:wwwroot.zip"
"Tag" = "8:"
"Folder" = "8:_957C6D0C8FC44AC0B56EA59602B3F5E3"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Vital" = "11:TRUE"
"ReadOnly" = "11:FALSE"
"Hidden" = "11:FALSE"
"System" = "11:FALSE"
"Permanent" = "11:FALSE"
"SharedLegacy" = "11:FALSE"
"PackageAs" = "3:1"
"Register" = "3:1"
"Exclude" = "11:FALSE"
"IsDependency" = "11:FALSE"
"IsolateTo" = "8:"
}
}
"FileType"
{
@@ -1263,6 +1646,17 @@
"Property" = "8:TARGETDIR"
"Folders"
{
"{9EF0B969-E518-4E46-987F-47570745A589}:_957C6D0C8FC44AC0B56EA59602B3F5E3"
{
"Name" = "8:Template"
"AlwaysCreate" = "11:FALSE"
"Condition" = "8:"
"Transitive" = "11:FALSE"
"Property" = "8:_CFF1CE57FF2B42A3AE7767110C50FBAE"
"Folders"
{
}
}
"{9EF0B969-E518-4E46-987F-47570745A589}:_A02FAE1984434D0C9BCF4CCA745960F5"
{
"Name" = "8:Data"
@@ -1326,7 +1720,7 @@
"Name" = "8:Microsoft Visual Studio"
"ProductName" = "8:ECO2_2025V1"
"ProductCode" = "8:{1C694875-DBD9-43E7-A9DC-0EEE63429810}"
"PackageCode" = "8:{172D8716-29F9-4949-8F2B-52F268078F21}"
"PackageCode" = "8:{4476376D-5BCD-4B0F-B2CB-BF13909AC674}"
"UpgradeCode" = "8:{650A91F6-635B-4C09-8A64-C123C180E487}"
"AspNetVersion" = "8:2.0.50727.0"
"RestartWWWService" = "11:FALSE"
@@ -1334,7 +1728,7 @@
"DetectNewerInstalledVersion" = "11:TRUE"
"InstallAllUsers" = "11:TRUE"
"ProductVersion" = "8:1.0.0"
"Manufacturer" = "8:기본 회사 이름"
"Manufacturer" = "8:KICT"
"ARPHELPTELEPHONE" = "8:"
"ARPHELPLINK" = "8:"
"Title" = "8:Setup ECO2_2025V1"
@@ -1454,7 +1848,7 @@
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"Target" = "8:_85623F2834184CA2A083635A5BAE18C9"
"Folder" = "8:_89D815457C274E5890E728BDBFF2EA16"
"WorkingFolder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Icon" = "8:_5D29234F4F444C9AAE7845416706303D"
@@ -1468,7 +1862,7 @@
"ShowCmd" = "3:1"
"IconIndex" = "3:0"
"Transitive" = "11:FALSE"
"Target" = "8:_DF16200C7C9B40998C022F2E37D1E143"
"Target" = "8:_85623F2834184CA2A083635A5BAE18C9"
"Folder" = "8:_8ACC8683286847D288C7D970B3389046"
"WorkingFolder" = "8:_6C7F44AB37914E6C92F78768ABD1BC22"
"Icon" = "8:_5D29234F4F444C9AAE7845416706303D"

View File

@@ -10,7 +10,7 @@
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>Utility</RootNamespace>
<AssemblyName>Utility</AssemblyName>
<TargetFrameworkVersion>v4.0</TargetFrameworkVersion>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">

View File

@@ -0,0 +1,135 @@
# WebView2 Fixed Version 배포 가이드
## 개요
ECO2 프로그램은 WebView2 Fixed Version 방식을 사용하여 오프라인 환경에서도 매뉴얼 뷰어를 사용할 수 있습니다.
## Fixed Version 다운로드
### 1. 다운로드 위치
https://developer.microsoft.com/microsoft-edge/webview2/#download-section
"Fixed Version" 섹션에서 다운로드합니다.
### 2. 버전 선택
- **플랫폼**: x86 (32-bit) - ECO2는 x86 타겟입니다
- **추천 버전**: 최신 Stable 버전
- 파일 크기: 약 100-150MB
### 3. 다운로드 파일 예시
- `Microsoft.WebView2.FixedVersionRuntime.{version}.x86.cab`
- 또는 압축 해제된 폴더 형태
## 배포 방법
### 1. 폴더 구조
```
{프로그램 설치 폴더}/
├── ECO2_2025V1.exe
├── WebView2Runtime/ ← Fixed Version 런타임 폴더
│ ├── msedge.exe
│ ├── msedgewebview2.exe
│ └── [기타 WebView2 파일들]
└── WebView2Data/ ← 사용자 데이터 폴더 (자동 생성됨)
└── [캐시, 쿠키 등]
```
### 2. 설치 단계
#### 방법 1: 수동 배포 (개발/테스트)
1. Fixed Version CAB 파일 또는 폴더 다운로드
2. CAB 파일인 경우 압축 해제
3. 압축 해제된 내용을 `WebView2Runtime` 폴더로 복사
4. `WebView2Runtime` 폴더를 프로그램 실행 파일과 같은 위치에 배치
#### 방법 2: 설치 프로그램 포함 (프로덕션)
Setup1 프로젝트에 WebView2Runtime 폴더를 포함:
1. Setup1.vdproj 열기
2. WebView2Runtime 폴더를 프로젝트에 추가
3. 설치 시 Application Folder에 복사되도록 설정
## 동작 방식
### 런타임 검색 순서
1. **Fixed Version 우선**: `{실행폴더}\WebView2Runtime` 폴더 검색
2. **시스템 런타임 폴백**: 시스템에 설치된 WebView2 Runtime 사용
3. **없을 경우**: 매뉴얼 기능 사용 시 오류 메시지 표시
### 프로그램 시작 시 검사
- MdiMain 로드 시 `CheckWebView2Runtime()` 메서드가 Fixed Version 존재 여부 확인
- Debug.WriteLine으로 경고 출력 (사용자에게는 미표시)
- 실제 사용 시점(매뉴얼 열기)에만 오류 표시
### 오프라인 환경
- Fixed Version이 배포되어 있으면 인터넷 연결 불필요
- 모든 런타임 파일이 로컬에 포함되어 있음
- 폐쇄망 환경에서도 정상 작동
## 버전 업데이트
### Fixed Version 업데이트 방법
1. 새 Fixed Version 다운로드
2. 기존 `WebView2Runtime` 폴더 백업 (선택사항)
3. 새 버전으로 `WebView2Runtime` 폴더 교체
4. 프로그램 재시작
### 주의사항
- WebView2Runtime 폴더는 약 100-150MB이므로 Git에 커밋하지 않음
- .gitignore에 이미 추가되어 있음
- 설치 프로그램에는 반드시 포함해야 함
## 테스트 방법
### 1. Fixed Version 테스트
```
1. WebView2Runtime 폴더가 있는 상태에서 프로그램 실행
2. "Manual" 메뉴 클릭
3. http://localhost:58123/ 페이지가 정상적으로 로드되는지 확인
```
### 2. 폴백(Fallback) 테스트
```
1. WebView2Runtime 폴더 임시 이름 변경 (예: WebView2Runtime_backup)
2. 프로그램 실행 (시스템 런타임 사용 시도)
3. "Manual" 메뉴 클릭
4. 시스템에 런타임이 있으면 정상 작동, 없으면 오류 메시지
```
### 3. 오프라인 테스트
```
1. 네트워크 연결 끊기
2. Fixed Version 배포된 상태에서 프로그램 실행
3. 매뉴얼 기능이 정상 작동하는지 확인
```
## 문제 해결
### "WebView2 구성 요소를 찾을 수 없습니다" 오류
**원인**: Fixed Version도 없고 시스템 런타임도 설치되지 않음
**해결**:
1. WebView2Runtime 폴더가 실행 파일과 같은 위치에 있는지 확인
2. WebView2Runtime 폴더 내에 msedgewebview2.exe 파일이 있는지 확인
3. 또는 시스템에 WebView2 Runtime 설치: https://go.microsoft.com/fwlink/p/?LinkId=2124703
### 페이지 로딩 실패
**원인**: 로컬 웹서버(http://localhost:58123/)가 실행되지 않음
**해결**:
1. 로컬 웹서버가 실행 중인지 확인
2. 포트 58123이 열려 있는지 확인
3. Frm_WebManual.vb의 Navigate URL 수정 필요 시 수정
### WebView2Data 폴더 문제
**원인**: 캐시 또는 쿠키 문제
**해결**:
1. 프로그램 종료
2. WebView2Data 폴더 삭제
3. 프로그램 재시작 (자동으로 새 폴더 생성됨)
## 참고 자료
- WebView2 공식 문서: https://learn.microsoft.com/microsoft-edge/webview2/
- Fixed Version 배포 가이드: https://learn.microsoft.com/microsoft-edge/webview2/concepts/distribution
- WebView2 다운로드: https://developer.microsoft.com/microsoft-edge/webview2/

View File

@@ -0,0 +1,68 @@
@echo off
chcp 65001 > nul
echo ========================================
echo OWIN NuGet 패키지 다운로드
echo (압축 해제는 수동으로 진행)
echo ========================================
echo.
REM 다운로드 폴더 생성
echo [1/2] 다운로드 폴더 생성 중...
if not exist "owin_packages" mkdir owin_packages
cd owin_packages
echo 완료
echo.
REM NuGet 패키지 다운로드 (.zip으로 저장)
echo [2/2] NuGet 패키지 다운로드 중...
echo.
echo 다운로드: Owin.1.0.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Owin/1.0.0' -OutFile 'Owin.1.0.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin/2.1.0' -OutFile 'Microsoft.Owin.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.Host.HttpListener.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Host.HttpListener/2.1.0' -OutFile 'Microsoft.Owin.Host.HttpListener.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.Hosting.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.Hosting/2.1.0' -OutFile 'Microsoft.Owin.Hosting.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.StaticFiles.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.StaticFiles/2.1.0' -OutFile 'Microsoft.Owin.StaticFiles.2.1.0.zip'"
echo 완료
echo 다운로드: Microsoft.Owin.FileSystems.2.1.0.zip
powershell -Command "Invoke-WebRequest -Uri 'https://www.nuget.org/api/v2/package/Microsoft.Owin.FileSystems/2.1.0' -OutFile 'Microsoft.Owin.FileSystems.2.1.0.zip'"
echo 완료
cd ..
echo.
echo ========================================
echo 다운로드 완료!
echo ========================================
echo.
echo 다운로드된 파일 목록:
dir /b owin_packages\*.zip
echo.
echo 다음 단계:
echo 1. owin_packages 폴더 열기
echo 2. 각 .zip 파일을 압축 해제
echo 3. 각 폴더의 lib\net40\ 경로에서 .dll 파일 찾기
echo 4. 모든 .dll 파일을 lib 폴더로 복사
echo.
echo 필요한 DLL 파일 목록:
echo - Owin.dll
echo - Microsoft.Owin.dll
echo - Microsoft.Owin.Host.HttpListener.dll
echo - Microsoft.Owin.Hosting.dll
echo - Microsoft.Owin.StaticFiles.dll
echo - Microsoft.Owin.FileSystems.dll
echo.
pause

143
host_eco2_guide_fixed.bat Normal file
View File

@@ -0,0 +1,143 @@
@echo off
chcp 65001 > nul
echo ========================================
echo ECO2 Guide Center 로컬 호스팅
echo ========================================
echo.
REM 현재 디렉토리 확인
set CURRENT_DIR=%CD%
echo 현재 디렉토리: %CURRENT_DIR%
echo.
REM eco2_guide_center 저장소 경로 확인
set GUIDE_REPO=eco2_guide_center
if not exist "%GUIDE_REPO%" (
echo [1/4] 저장소 클론 중...
git clone https://github.com/VeryColdplay/eco2_guide_center.git
if errorlevel 1 (
echo 오류: 저장소 클론 실패
echo Git이 설치되어 있는지 확인하세요.
pause
exit /b 1
)
echo 완료
) else (
echo [1/4] 저장소 업데이트 중...
cd %GUIDE_REPO%
git pull
cd ..
echo 완료
)
echo.
REM 필요한 패키지 설치
echo [2/4] Python 패키지 설치 중...
echo (네트워크 연결이 필요합니다. 시간이 걸릴 수 있습니다...)
echo.
REM 방화벽이나 프록시 문제가 있을 수 있으므로 개별 설치 시도
pip install mkdocs-material 2>nul
if errorlevel 1 (
echo 경고: mkdocs-material 설치 실패 - 이미 설치되어 있거나 네트워크 문제일 수 있습니다.
)
pip install mkdocs-macros-plugin 2>nul
pip install mkdocs-mermaid2-plugin 2>nul
pip install mkdocs-table-reader-plugin 2>nul
pip install mkdocs-glightbox 2>nul
pip install mkdocs-git-revision-date-localized-plugin 2>nul
pip install mkdocs-minify-plugin 2>nul
pip install mkdocs-awesome-pages-plugin 2>nul
echo 패키지 설치 시도 완료
echo.
REM MkDocs 빌드
echo [3/4] MkDocs 빌드 중...
cd %GUIDE_REPO%
REM mkdocs.yml에서 awesome-pages 플러그인 제거 (임시)
echo awesome-pages 플러그인 비활성화 중...
powershell -Command "(Get-Content mkdocs.yml) -replace ' - awesome-pages', ' # - awesome-pages' | Set-Content mkdocs_temp.yml"
REM 정적 사이트 빌드
echo MkDocs 빌드 실행...
mkdocs build -f mkdocs_temp.yml
if errorlevel 1 (
echo.
echo 오류: MkDocs 빌드 실패
echo.
echo 해결 방법:
echo 1. Python이 설치되어 있는지 확인
echo 2. 인터넷 연결 확인
echo 3. 방화벽/프록시 설정 확인
echo 4. 관리자 권한으로 실행
echo.
echo 또는 수동 설치:
echo pip install mkdocs-material mkdocs-awesome-pages-plugin
echo.
del mkdocs_temp.yml 2>nul
cd ..
pause
exit /b 1
)
del mkdocs_temp.yml 2>nul
echo 완료
echo.
REM ECO2 wwwroot 폴더로 복사
echo [4/4] ECO2 wwwroot로 복사 중...
cd ..
REM wwwroot 폴더 생성
if not exist "wwwroot" mkdir wwwroot
REM 기존 파일 백업 (선택사항)
if exist "wwwroot\index.html" (
echo 기존 파일 발견 - 백업 생성 중...
if not exist "wwwroot_backup" mkdir wwwroot_backup
xcopy /E /I /Y "wwwroot\*" "wwwroot_backup\" > nul
)
REM site 폴더 내용 복사
echo 빌드된 파일 복사 중...
xcopy /E /I /Y "%GUIDE_REPO%\site\*" "wwwroot\" > nul
if errorlevel 1 (
echo 오류: 파일 복사 실패
pause
exit /b 1
)
echo 완료
echo.
REM 파일 개수 확인
for /f %%A in ('dir /b /s "wwwroot\*.html" ^| find /c ".html"') do set HTML_COUNT=%%A
echo 복사된 HTML 파일: %HTML_COUNT%
echo.
echo ========================================
echo 호스팅 준비 완료!
echo ========================================
echo.
echo wwwroot 폴더: %CURRENT_DIR%\wwwroot
echo.
echo 다음 중 한 가지 방법으로 접속:
echo.
echo [방법 1] ECO2 프로그램의 OWIN 서버 사용
echo 1. ECO2 프로그램 실행
echo 2. OWIN 서버 시작 (포트 58123)
echo 3. 브라우저: http://localhost:58123
echo.
echo [방법 2] MkDocs 개발 서버 사용 (추천 - 자동 새로고침)
echo 1. cd eco2_guide_center
echo 2. mkdocs serve
echo 3. 브라우저: http://127.0.0.1:8000
echo.
echo [방법 3] Python 간단 서버 사용
echo 1. cd wwwroot
echo 2. python -m http.server 8080
echo 3. 브라우저: http://localhost:8080
echo.
pause

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/Microsoft.Owin.dll Normal file

Binary file not shown.

BIN
lib/Owin.dll Normal file

Binary file not shown.

BIN
nuget.exe Normal file

Binary file not shown.

1
run_claude.bat Normal file
View File

@@ -0,0 +1 @@
claude --dangerously-skip-permissions