ํ์ฌ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ p / invoke๊ฐ ํ์ํ ๋ชจ๋์๋ก๋ํ๋ ค๊ณ ํ๋ฉด p / invoking์ ์ํํ๋ DLL๊ณผ ๋์ผํ ํด๋์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ๋ก๋ํ์ง ๋ชปํฉ๋๋ค.
์ด๊ฒ์ PowerShell Core 6.1.0์์ _ ์๋ํ๋ ๋ฐ ์ฌ์ฉ๋์์ง๋ง 6.2.0-preview1๊ณผ 6.2.0-preview2 ์ฌ์ด์์ ํ๊ทํ์ต๋๋ค. Windows PowerShell์์ ๊ณ์ ์๋ํฉ๋๋ค.
์ฐพ์ง ๋ชปํ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฐพ์ผ๋ ค๊ณ ํ๋ SkiaSharp.dll๊ณผ ๋์ผํ ํด๋์ ์์ต๋๋ค. https://github.com/PowerShell/PowerShell/issues/8861#issuecomment -462362391 ๋ฐ ํด๋น ๋ฌธ์ ์ค๋ ๋๋ฅผ ์ฐธ์กฐ
Install-Module PSWordCloud
New-WordCloud
cmdlet New-WordCloud at command pipeline position 1
Supply values for the following parameters:
InputObject:
new-wordcloud : The type initializer for 'PSWordCloud.WCUtils' threw an exception.
At line:1 char:1
+ new-wordcloud
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], TypeInitializationException
+ FullyQualifiedErrorId : System.TypeInitializationException
$Error[0].Exception.GetBaseException() | Format-List * -F
๊ธฐ๋ณธ ์์ธ๋ฅผ ์ฟผ๋ฆฌํ๋ฉด ๋ค์์ด ์์ฑ๋ฉ๋๋ค.
Message : Unable to load DLL 'libSkiaSharp' or one of its dependencies: The specified module could not be
found. (Exception from HRESULT: 0x8007007E)
TypeName :
Data : {}
InnerException :
TargetSite : IntPtr sk_fontmgr_ref_default()
StackTrace : at SkiaSharp.SkiaApi.sk_fontmgr_ref_default()
at SkiaSharp.SKFontManager.get_Default()
at PSWordCloud.WCUtils..cctor()
HelpLink :
Source : SkiaSharp
HResult : -2146233052
Name Value
---- -----
PSVersion 6.2.0
PSEdition Core
GitCommitId 6.2.0
OS Microsoft Windows 10.0.17763
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0โฆ}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
_ ์ฐธ๊ณ : _ Mac ํ๊ฒฝ (@steviecoaster์๊ฒ ๊ฐ์ฌํฉ๋๋ค!)์์ ๋์ผํ ํ ์คํธ๋ฅผ ์ํํ์ผ๋ฉฐ ๋์ผํ ๋ฐฉ์์ผ๋ก ์คํจํ์ต๋๋ค. Linux ๋ฐฐํฌํ์์๋ ๋์ผ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
/ cc @ SteveL-MSFT
@adityapatwardhan ๋น์ ์ด ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๊น?
procmon
์ ํธ๋ฆฌํฐ๋ก ์ฌ์ฉ ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๋ค์ HintPath ๋ก ์์ ์ ์๋ ํ ์ ์์ต๋๋ค
๋๋ ๊ทธ๊ฒ์ ๋ณด์ฌ์ค ๊ฒ์ด์ง๋ง ์ด๊ฒ์ด ๋ด๊ฐ ์ง์ ๋ก๋ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ๋ ์ ์ ๊ฐ์ํ ๋ (์ฃผ SkiaSharp.dll ์์ฒด์ ์ํด๋ก๋ ๋จ) ๋๋ฌด ๋ง์ ์ผ์ํ๋ค๋ ํ์ ์ด ์์ต๋๋ค. ํ๋ซํผ์ ๋ฐ๋ผ๋ก๋ ํ ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ์ผ์ด 4 ๊ฐ๋ผ๋ ์ฌ์ค๋ ์ํฉ์ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค.
๊ทธ๋ฌ๋ ์ด์จ๋ ์ด๊ฒ์ ์๋์ ์ธ ๋ณ๊ฒฝ์ฒ๋ผ ๋ณด์ด์ง ์์ผ๋ฏ๋ก ํ๊ท ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผํฉ๋๋ค.
MSFT ํ์ .Net Core 3.0์์ vNext p / invokes์ ๋ํด ์ด์ฌํ ์ผํ๋ฉฐ ์๋ง๋ 2.1๋ก ๋ฐฑ ํฌํ ํ์ ๊ฒ์ ๋๋ค. PowerShell ๊ด๋ จ dll ๋ก๋ฉ์์ ์๋ฌด๊ฒ๋ ๋ณ๊ฒฝ ํ ๊ฒ์ ๊ธฐ์ตํ์ง ๋ชปํฉ๋๋ค.
6.2.0-preview2์์ # 8073 ๋ฐ ๋ช ๊ฐ์ง Internal
๋ณ๊ฒฝ ์ฌํญ์ด ์์ต๋๋ค. ๋๋ ๊ทธ ๋์์ ๋ฌด์์ด ๋ฐ๋ ์๋์ง ์ ํ ๋ชจ๋ฅธ๋ค. ๐
PR ๋ณ๊ฒฝ์ ๋จผ์ ๋ชจ๋ ํด๋์์ ๋ชจ๋ dll์๋ก๋ ํ ๋ค์ GAC์์๋ก๋ํ๋ ๊ฒ์ ๋๋ค. ๋ฌธ์ ๋ ๋ชจ๋ dll์ด ๋ ๋ฒ์งธ dll์ ์ฐธ์กฐํ๊ณ ์๋ dll๋ก๋ (PowerShell์ด โโ์๋ Core)๊ฐ dll์ ์ฐพ์ง ๋ชปํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ด ์ ์์ ํ๋ก์ ํธ ํ์ผ์ dll์ ํํธ ๊ฒฝ๋ก๋ฅผ ๋ช ์ ์ ์ผ๋ก ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค.
@iSazonov ๋ด csproj์ ์ผ๋ถ HintPath ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํ์ง๋ง dotnet publish
๋ ๊ฒฝ๊ณ ๋ง ํ์๋ฉ๋๋ค. ์ผ๋จ๋ก๋ ๋ ๋ชจ๋์ ๋์์๋ ๋ณํ๊ฐ ์์ต๋๋ค.
์กฐ๊ธ ๋ ์ฝ์ด ๋ณด๋ฉด HintPath๊ฐ ํ๋ก์ ํธ ๋น๋ ์์ฒด์ _ ํฌํจ๋์ง ์์ _ ์ธ๋ถ ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ฐธ์กฐํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒ ๊ฐ์ต๋๋ค. SkiaSharp ์ด์ ๋ธ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ปดํ์ผ / ๋น๋ ์ฉ HintPath๋ฅผ ์ถ๊ฐํด๋ Skia DLL์ด๋ ๋ฐํ์์ ์กฐํํ๋ ๊ฒฝ๋ก์ ์ํฅ์์ฃผ์ง ์์ต๋๋ค.
์ฐธ๊ณ ๋ก ์ด๊ฒ์ ๋ด csproj์ ๋๋ค.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="PowerShellStandard.Library" Version="5.1.1" PrivateAssets="All" />
<PackageReference Include="SkiaSharp" Version="1.68.0" />
<PackageReference Include="SkiaSharp.NativeAssets.Linux" Version="1.68.0" />
</ItemGroup>
</Project>
๋ค์ ์ค์ ์๋ฌด ํจ๊ณผ๋์์ด ์ถ๊ฐํ์ต๋๋ค (์ฐพ์ ์ ์๋ค๋ ๋น๋ / ๊ฒ์ ์๊ฐ ๊ฒฝ๊ณ ์ธ์๋ ๊ฒ์๊ฐ ์๋ฃ ๋ ๋๊น์ง ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค).
<ItemGroup>
<Reference Include="libSkiaSharp">
<HintPath>win-x86/libSkiaSharp.dll</HintPath>
<HintPath>win-x64/libSkiaSharp.dll</HintPath>
<HintPath>osx/libSkiaSharp.dylib</HintPath>
<HintPath>linux-x64/libSkiaSharp.dylib</HintPath>
</Reference>
</ItemGroup>
HintPath์์ ์ฝ์ ๋ด์ฉ์ ๋ฐ๋ฅด๋ฉด DLL์๋ก๋ ํ ๋ ๊ฒ์๋๋ ๊ฒฝ๋ก ๋๋ ํด๋น DLL์ด p / invoke ๋ชฉ์ ์ผ๋ก ๋ค๋ฅธ DLL์๋ก๋ํ๋ ค๊ณ ์๋ํ๋ ๋ฐ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
_That_ HintPath๋ ์ปดํ์ผ ํ์์๋ง ํด๋น๋ฉ๋๋ค.
๋น์ ์ด ๋งํ๋ ๋ฐฉ์์ด ๋ด๊ฐ ๋์น ๋ ๋ค๋ฅธ ๊ฒ์ด์๋ ๊ฒ์ฒ๋ผ ๋ค๋ฆฌ๋๊ฐ?
@ vexx32 ๊ฐ๋จํ repo ์ฝ๋๊ฐ ์๋ค๋ฉด CoreCLR ์ ์ฅ์์์ ์์ฒญํ ์ ์์ต๋๋ค.
์์ง Powershell ๊ด๋ จ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐฐ์ ํ ์ ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฝ์ ์ฑ์ ๋ํ ์์ ํ ์คํธ๋ฅผ ํจ๊ปํ๊ณ ์ด๋ป๊ฒ ์งํ๋๋์ง ํ์ธํด์ผ ํ ์๋ ์์ต๋๋ค.
@Jaykul ์ ํ ๋๋ถ์ ์ ๋
Add-Type -TypeDefinition @"
using System.Runtime.InteropServices;
public class DllLoadPath
{
[DllImport("kernel32", CharSet=CharSet.Unicode)]
public static extern int SetDllDirectory(string NewDirectory);
}
"@
# ...
[DllLoadPath]::SetDllDirectory($NativeRuntimeFolder)
๊ทธ๋ฌ๋์ด ์์ ์ ์ํํ๊ธฐ ์ํด ์ถ๊ฐ p / invoke๋ฅผ _ ์๊ตฌ _ํ๋ค๋ ์ฌ์ค์ ์ฐ์ค๊ฝ ์ค๋ฝ์ต๋๋ค. ๋ํ ์ฌ๊ธฐ์ ์ค๋ช ๋๋๋ก ํ์ค ๊ฒ์ ์์น์์๋ก๋ ๋ SkiaSharp.dll์ ์์ฒด ๋๋ ํ ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ๋ณ๊ฒฝํ๊ณ ์ ๊ฑฐํ๋ ๊ฒ์ ๋ํด ๋งค์ฐ ํผ๋ ์ค๋ฝ
@ vexx32 ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค. ์ฌํ์์ ๋ญ๊ฐ ๋์น ๊ฒ ์๋์? PSWordCloud์ ๊ฒฝ์ฐ ํน์ ๋ฒ์ ์ผ๊น์?
PS> Install-Module PSWordCloud
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from
'PSGallery'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y
PS> New-WordCloud
cmdlet New-WordCloud at command pipeline position 1
Supply values for the following parameters:
InputObject:
Path:
PS> $PSVersionTable
Name Value
---- -----
PSVersion 6.2.0
PSEdition Core
GitCommitId 6.2.0
OS Microsoft Windows 10.0.18885
Platform Win32NT
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0โฆ}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
์ฃ์กํฉ๋๋ค. ์ธ๊ธํ๋ฏ์ด 2.1.1์์ ์์ ํ์ต๋๋ค.
2.1.0์ ํน๋ณํ ์ค์นํ๋ฉด ์์ p / invoke ํด๊ฒฐ ๋ฐฉ๋ฒ์ด ์๊ธฐ ๋๋ฌธ์ ์ค๋ฅ๊ฐ ํ์๋ฉ๋๋ค.
์ข์, ์ด์ ์ฌํ ํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ดํด๋ณผ ๊ฒ.
@ vexx32 ์ฐ๋ฆฌ๊ฐ์ ๋์ด๋ ๋ชจ๋ ํ์ผ์๋ก๋ ํ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค FileList
์ psd1
. ๊ทธ๊ฒ ํ์ํฉ๋๊น? FileList
์์ ๋ชจ๋ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ฉด ๋ ์ด์ ๋ฌธ์ ๋ฅผ ์ฌํ ํ ์ ์์ต๋๋ค.
๊ทธ๋์? ๊ทธ๊ฒ์ ๋งค์ฐ ์ด์ํฉ๋๋ค. ์๋์, ํน๋ณํ ํ์ํ์ง๋ ์์ผ๋ฉฐ, ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ์ด์จ๋ ์ ๊ฑฐ ํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ช ๊ฐ์ง ๋ฒ์ ์ ์ ์ฉ๋์์ต๋๋ค.
๊ทธ๋๋ ๊ฐ์๊ธฐ DLL๋ก๋์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ด๋ผ๋ ์ ์ด ์ด์ํฉ๋๋ค.
psd1์ FileList์ ๋์ด๋ ๋ชจ๋ ํ์ผ์๋ก๋ ํ ๊ฒ ๊ฐ์ต๋๋ค.
.psd1 ํ์ผ์์ "if"๋ฅผ ์ง์ํ๋ ๋ฐ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ ํ๋ซํผ ๋ณ dll์๋ก๋ ํ ์ ์์ต๋๋ค.
@iSazonov ๊ทธ๊ฒ์ # 5541 ์ ๋๋ค. ๊ณง ์ ๋ฐ์ดํธ๋ฅผ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๊ทธ๊ฒ์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. ๋ด๊ฐ ๊ถ๊ธํดํ๋ ๊ฒ์ _now_ FileList์ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (๋ชจ๋)์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ๋ค๋ฉด ... p / invoke๊ฐ ํ์ํ์ง ์์ ์๋ ์์ต๋๋ค. ํ ์คํธํด๋ณผ ๊ฒ์! ๐
ํธ์ง : ์๋์, ํจ๊ณผ๊ฐ์๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง ์์ต๋๋ค. :(
๊ด๋ฆฌ๋๋ ์ด์
๋ธ๋ฆฌ ๋ง๋ก๋ํ๋ Assembly.Load()
๋ฅผ ํธ์ถํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ณํ ์ฐ๋ฆฌ๊ฐ GAC์๋ณด๊ณ ํ๊ธฐ ์ ์ ๋ชจ๋ ํด๋์์๋ก๋ DLL์ ์์ํ ๊ฒฝ์ฐ 6.2.0-preview.2์ ์์ต๋๋ค. ์ด ๋ณ๊ฒฝ์ ๋ถ์์ฉ์ FileList์ DLL๋๋ก๋ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ง์ด ๋๋ค์. ๋ฌธ์ ๋ฌธ์ ๊ฐ ์ด๋ ค ์์ต๋๊น? ๋๊ตฐ๊ฐ๊ฐ ๊ทธ๊ฒ์ ๋ฐ๊ฒฌํ๊ณ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ๋ฌธ์ํํ์ง ์์ ๊ฒฝ์ฐ ์ถ์ ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ค์ธ ๊ฒ์ ๋๋ค. ์ด๋ฌํ ์ด์ ๋ก ํ์ผ ๋ชฉ๋ก์ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ๋ฃ์ง ์์ผ๋ ค๋ ๊ฒ์ ๋ฌธ์ํํด์ผํฉ๋๋ค.
๊ทธ๊ฒ์ ์ถ์ ํ๋ ๋ฐ ๋์์ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ง๊ธ์ ๋ด๊ฐ ์ธ๊ธ ํ P / invoke ์๋ฃจ์ ์ด ๊ฐ์ฅ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ๋ชจ๋ ๋ก๋ฉ์์ ์ด๋ฌํ ๊ฒ๋ค์ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ผ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด PrivateData์์ ํค๊ฐ ์ง์๋๋ ํ๋ซํผ ์ด๋ฆ / ์ํคํ ์ฒ์ ์ผ์นํ๋ ํด์ ํ ์ด๋ธ ์ธ RuntimeLibPaths๋ผ๋ ํญ๋ชฉ์ ์ถ๊ฐํ๊ณ ๊ฐ์ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํฌํจ ๋ ํด๋์ ๊ฒฝ๋ก์ ๋๋ค. ๊ฐ์ ธ ์ค๊ธฐ์ ๋ชจ๋ ์์ฒด์์ ์ถ๊ฐ ํ ํ์์์ด PowerShell์์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ ธ์ฌ ๋ ์ ์ ํ ํด๋๊ฐ dll ๊ฒ์ ๊ฒฝ๋ก์ ์ถ๊ฐ๋ฉ๋๋ค.
๋ฌธ์ ๋ฌธ์ ๊ฐ ์ด๋ ค ์์ต๋๊น?
์ฐ๋ฆฌ๋ํ์ง ์์์ต๋๋ค.
@TylerLeonhardt์ @adityapatwardhan @ SteveL - MSFT์ ๊ฐ์ฌ (์ค์๋ก) ๋๋ ์ฒ ์ ํ๊ฒํ๋ ค๋ฉด์ด ๋๋ฌด Windows ์ด์ธ์ ๊ฒ๋ค์ ๋ํ ์์ ์ ๋ํด ๊ฐ์ง๋ ์ ๋ฅผ ์๊ฐ ๋๊ฒ ... ๋๋ ๋ ์๋ฒฝํ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค.
ํ์ฌ ๋ค์ดํฐ๋ธ interop์ด .NET Core ์์ฒด์์ ์ฒ๋ฆฌ๋์ด์ผํ๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ช ํํ ๋ฌธ์๊ฐ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ด๊ฐ ์ฐพ์ ์์๋ ๋ชจ๋ ๋ ์ด MS์ ๋ฌธ์์์ .NET ํ๋ ์ ์ํฌ์ ๋ํ ํ์ด์ง์ ๋๋ค.
Mono ๋ฑ์ ํตํด ์ฒ๋ฆฌ๋ฉ๋๊น? Mono๋ฅผ ํตํ๋ ๊ฒฝ์ฐ์ด ํ์ด์ง๋ฅผ ๋ณด๋ฉด ์ค์ ๋ก Mac OS์ Mono_์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ๊ฒฝ๋ก๊ฐ ์ ์ ํ๊ฒ ์กด์ค๋๋ ๊ฒ์ ๋ฐฉ์งํ๋ _bug๊ฐ ์์ต๋๋ค.
PowerShell ...์ด๋ฅผ ์ฒ๋ฆฌํด์ผํฉ๋๋ค. ๋ชจ๋ ์์ฒด์ ๋ชจ๋ ํ๋ซํผ์์์ด๋ฅผ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋์ง ์ ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
@ vexx32 ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ชจ๋ฆ ๋๋ค. PowerShell์ ํฌํจํ์ง ์๋ C #์์ ์ฌํ์ ์์ฑ ํ ์ ์๋ค๋ฉด CoreCLR repo์์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.
@ steveL-msft๊ฐ ๋ฌธ์ ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ ํ ๋ช ๊ฐ์ง ๊ฒฝ๊ณ ๊ฐ ์์ง๋ง ๋ค๋ฅธ ๊ณณ์์๋ ์ ์๋ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฅผ ๋ค์ด ๊ธฐ๋ณธ lib๋ฅผ๋ก๋ํ๋ ๊ฒ์ ๊ธฐ๋ณธ SkiaSharp.dll๊ณผ ๋์ผํ ํด๋์์๋ ๊ฒฝ์ฐ ์๋ํ์ง๋ง @adityapatwardhan์ด ์ธ๊ธ ํ ๋ณ๊ฒฝ์ผ๋ก ์ธํด ์๋ํ์ง ์๋ PS์ ๊ฒฝ์ฐ์๋ ์๋ํฉ๋๋ค. ์ด๋ PowerShell๋ก ์์ ํ๋ ๊ฒฝ์ฐ์ ๋ชจ๋์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ด๋ ค์์ ๋ฐฐ๊ฐ์ํฌ๋ฟ์ ๋๋ค.
์ด๋ฌํ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์์ ํ๋ ๋๋ถ๋ถ์ ์ํฉ์์๋ ์ง์๋๋ ๊ฐ ํ๋ซํผ์ ๋ํด ํจํค์งํ ํ ์ ์๊ธฐ ๋๋ฌธ์ ์ถ์ํ ํ ์ ์์ต๋๋ค. ๋ถํํ๋ ๊ฒ์ ๊ฐ๋ฅ์ฑ๊ณผ ์ต์ข ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๋ง ๋์ 3 ๊ฐ ์ด์์ ์์ ํ ๋ถ๋ฆฌ ๋ ๊ฐค๋ฌ๋ฆฌ ๋ชจ๋์ ํจํค์งํํ๊ณ ์ ์ง ๊ด๋ฆฌํ์ง ์๋ ํ, PS ๋ชจ๋์ ๋ํ ์ฌ์น๊ฐ ์์ต๋๋ค.
PS๊ฐ ํฌ๋ก์ค ํ๋ซํผ ๋๊ตฌ๋ผ๋ ์ ์ ๊ฐ์ํ ๋ ๋ชจ๋์์ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ๋ฆฌ ํ ์์๋ ๋ฐฉ๋ฒ์ด ํ์ํ๊ฑฐ๋ PackageManagement ๋ชจ๋์ด nupkg์์ ํ๋ซํผ๋ณ๋ก ์ถ์ถ ๋ ๋ณ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํ์ํจ์ ์ธ์ํ๋๋กํ๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค.
๋๋ ๋์ฒด ์๋ฃจ์ ์ ์ด๋ ค ์์ง๋ง ์ฌ๊ธฐ์์๋ ๋ฐํฌ๋ ๊ฝค ๋ถ์กฑํ ๊ฒ ๊ฐ์ต๋๋ค. : ํผ๋ :
@ vexx32 ๋๋ ๋น์ ์ด ์ด๋ฐ ๊ฒ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค https://github.com/PowerShell/PowerShellGet/issues/273
CoreFX 3.0์์๋ pinoke ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ์ํ ๋ช ๊ฐ์ง ์๋ก์ด API๋ฅผ ์ป์ต๋๋ค. ๊ทธ๋ค์ ๊ธธ์ ์์์ ๋ถ๊ณผํ์ง๋ง Mono๋ณด๋ค ๋ ๋์ ๊ฒ์ ์ํฉ๋๋ค.
ํ์ฌ ๋ด ์๋ฃจ์
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ScriptsToProcess
๋ ๋ชจ๋ ๊ฐ์ ธ ์ค๊ธฐ์์ p / invoke๋ฅผ ์ฒ๋ฆฌํ์ฌ 32 ๋นํธ ๋๋ 64 ๋นํธ ๋ฒ์ ์ Windows ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ผ ์ด๋ฆ์ด ๋์ผํ๋ฏ๋ก ํ์ ํด๋์ ์ ์ฅ๋์ด์ผํฉ๋๋ค.์ด์์ ์ด์ง ์๊ณ @TylerLeonhardt ๊ฐ ์ค๋๋ ๊ทธ์ ์คํธ๋ฆผ์์ ์ฆ๋ช ํ ์
@ vexx32 ๋ ์ธ๋ถ ์ ๋ณด๋ฅผ ๋ชจ๋ฆ ๋๋ค. PowerShell์ ํฌํจํ์ง ์๋ C #์์ ์ฌํ์ ์์ฑ ํ ์ ์๋ค๋ฉด CoreCLR repo์์ ๋ฌธ์ ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ข์ต๋๋ค.
C #์์๋ ๋ค์ ์ค ํ๋๋ฅผ ์ํํฉ๋๋ค.
@ vexx32 ์ด PowerShell / PowerShellGet # 273 ๊ณผ ๊ฐ์ ๊ฒ์ ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ด์ด ๋ฒ๊ทธ๊ฐ ์ ์ถ ๋ ์ด์ ์ ๋๋ค. PowerShell 6.2 ์ดํ @ vexx32 ๋ ์ฌ๋ฐ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋๋ก PowerShell ์ ์ป๋ ๋ฐฉ๋ฒ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ _just Windows_์์ ์๋ํ๋ ๋ฒ์ ๋ ์ป์ ์ ์์ต๋๋ค.
Windows์๋ ์ ์ด๋ ap / invoke๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๊ทธ๊ฒ์ _ ํด๊ฒฐ ๋ฐฉ๋ฒ _์ด์ง๋ง ์ค์ ๋ก ๋ ๋์ ์์ ์ด ํ์ํฉ๋๋ค.
๊ทธ๋ฌ๋ Unix ์์คํ ์์๋ _ ์ฌ์ฉํ ์์๋ p / invoke_๊ฐ ์์ต๋๋ค. ๋ด๊ฐ ์ฐพ์ ์ ์์๋ ๊ฒ๊ณผ ์ด๋ค ์ด์ ๋ก ๋ PowerShell์ ์ผ๋ฐ์ ์ผ๋ก DllImport๋ฅผ ์๋ ํ ๋ ๊ฒ์ ํ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ด๋ ํ๊ฒฝ ๋ณ์๋ฅผ ์ฟผ๋ฆฌํ์ง ์์ต๋๋ค. PS์ ์ํด๋ก๋ ๋ ์ด์ ๋ธ๋ฆฌ.
๊ทธ๋์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ํ๋ซํผ์์ ์ด๊ฒ์ ... ๋ฌด์์ด๋ ํ๊ธฐ์๋ ๋งค์ฐ ๋น์ฐํธ์ ์ ๋๋ค. ๐
ํ์ฌ๋ก์๋ ๋ชจ๋ ๋ฃจํธ ํด๋์ ์ง์ ๋ชจ๋ Unix ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ ํฌํจํ๋ ๊ฒ ์ธ์ ๋ค๋ฅธ ์ต์ ์ด์๋ ๊ฒ ๊ฐ์ต๋๋ค (์ด๋ ์ด๋ฆ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ผ๋ฏ๋ก ์ง์ํ ์์๋ ํ๋ซํผ์ ์ ํ ํจ). p / invoke๋ฅผ ์ฌ์ฉํ์ฌ Windows์ ๊ฒ์ ๊ฒฝ๋ก์ ์ถ๊ฐํ๋ ํด๋ (x86 Windows ์ง์์ ๊ด์ฌ์ด์๋ ๊ฒฝ์ฐ- @TylerLeonhardt ๋ ์ด์ํ ์ด์ ๋ก Azure Functions๊ฐ x86์์ ์คํ ์ฃผ๋ฏ๋ก ์์ ํ๋ ค๋ ๊ฒฝ์ฐ ํ์ํฉ๋๋ค. ๊ทธ.)
์ด๊ฒ์ ํ๋ซํผ์ ์ ํฉํ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ๋ก๋ํ๊ธฐ ์ํด psm1 ํ์ผ์์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ฐธ๊ณ : Linux ๋ฐ Windows์์๋ง ์ด๊ฒ์ ๋์์ผ๋ก / ํ ์คํธํ์ต๋๋ค.
# Module PSM1 File
$binPath = Join-Path $PSScriptRoot bin $(if ($IsWindows) {"Windows"} else {"Linux"})
Add-Type -Path $binPath\Acme.Api.dll
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ Acme.Api.dll์ ๋ค์ด๊ฐ๋ C # ์ฝ๋์ ๋๋ค.
[Flags]
public enum DLOpenFlags
{
RTLD_LAZY = 1,
RTLD_NOW = 2,
RTLD_LOCAL = 4,
RTLD_GLOBAL = 8,
}
public static class LinuxNativeMethods
{
[DllImport("libdl.so", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern IntPtr dlopen(
string dlToOpen,
DLOpenFlags flags);
}
public static class Win32NativeMethods
{
[DllImport("kernel32.dll", EntryPoint="LoadLibraryW")]
public static extern IntPtr LoadLibrary(
[InAttribute, MarshalAs(UnmanagedType.LPWStr)] string dllToLoad);
}
public static class FooNativeMethods
{
// On Linux/macOS the shared lib must be named Foo.so and not libFoo.so
public const string LibName = "Foo";
static FooNativeMethods()
{
string assemblyDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
string nativeDllPath = Path.Combine(assemblyDir, "Windows", $"{LibName}.dll");
LibHandle = Win32NativeMethods.LoadLibrary(nativeDllPath);
}
else
{
string nativeSOPath = Path.Combine(assemblyDir, "Linux", $"{LibName}.so");
LibHandle = LinuxNativeMethods.dlopen(nativeSOPath, DLOpenFlags.RTLD_LAZY);
}
}
public static IntPtr LibHandle { get; private set; }
[DllImport(LibName, CallingConvention = CallingConvention.Cdecl)]
public static extern int getLastError(
StringBuilder buffer,
ref int bufferLength);
...
}
@ vexx32 CoreCLR ์ ์ฅ์์์ ์ปจ์คํ ๋ฌธ์ ๋ฅผ ์ด โโ์ ์์ต๋๋ค. ๋๋ ๊ทธ๋ค์ด ํ ๋ง์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
@rkeithhill ์ด๊ฒ์ .NET ๋ฐ์ด๋๋ฆฌ์์๋ง ์๋ํฉ๋๋ค. ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ๊ธฐ ์ํด P / invoke๋ฅผ ์ฌ์ฉํด์ผํ๋ .NET ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํด์ผํฉ๋๋ค. ๊ทธ๊ฒ์ด ์คํจํ๊ณ ์์ ํ ๋ฌด๋์ง๋ ๊ณณ์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์ด ํ ์ ์์ผ๋ฉฐ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์ด ๊ฒฝ์ฐ SkiaSharp)์ ๋๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ด ๋ชจ๋์์ ์ฝ๋๊ฐ๋ก๋๋๋ ๋์์๋ก๋๋์ด์ผํ๋ฏ๋ก์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ด ๋ฐ์ด๋๋ฆฌ ๋ชจ๋์๋ก๋ ํ ์ ์์ต๋๋ค. ๋ด ๋ชจ๋์ SkiaSharp๊ฐ๋ก๋ ๋ ์ํ์์๋ง ์กด์ฌํ๊ณ ์๋ํ๋ ์ ํ์๋ง ์์กดํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
@isazonov ๋ ์ง๊ธ์ด ๋ฌธ์ ์์ ๋ช ๋ฒ ๋ค๋ฃจ์ .net Core์์๋ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค .
PowerShell์์ด ์์ ์ ์ํ ํ ์์๋ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒ์ ๊ฒฝ๋ก์์ ์ผ๋ถ ํ์ค ๊ฒฝ๋ก๋ฅผ ์ฐ์ฐํ ์ ๊ฑฐ ํ์ฌ ์ผ๋ถ ์ปจํ ์คํธ์์ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ๋ก ์์ ํ๋ ๊ฒ์ด ๋ฌธ์ ๊ทธ๋๋ก ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค๋ฉฐ ๋งค์ฐ ์ทจ์ฝํ๊ณ ํนํ ์์ .
๋ฟก๋ฟก
๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ๊ธฐ ์ํด P / invoke๋ฅผ ์ฌ์ฉํด์ผํ๋ .NET ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํด์ผํฉ๋๋ค. ๊ทธ๊ฒ์ด ์คํจํ๊ณ ์์ ํ ๋ฌด๋์ง๋ ๊ณณ์ ๋๋ค.
์ด, ๊ทธ๊ฒ์ด ์ฝ๋๋ ๋ฐ๋ก ์ด๋ฌํ ๊ฒ์ ๋๋ค. ํ๋์ Windows์ Linux ๋ชจ๋์์ 6.2์์ ์ฑ๊ณต์ ์ผ๋ก ์ฌ์ฉํ์ต๋๋ค.
์์ , ์ฃ์กํฉ๋๋ค. ๋ช ํํ์ง ์์์ต๋๋ค. ๋ด ๋ฐ์ด๋๋ฆฌ์์๋์ด ์์ ์ ์ํ ํ ์ ์์ต๋๋ค. ๋ด ๋ชจ๋์ด๋ก๋ ๋ ๋ ์ ํ์ด ์์ด์ผํฉ๋๋ค. ๋ช ๋ น ์ธ์คํด์คํ ์ค์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค .... ๊ทธ๋ด ํ์๋ ์์ต๋๋ค.
๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ ํ ๋ PowerShell์ .net ์ฝ์ด ๋ณด๋ค ๊ธฐ๋ฅ ์ด ๋จ์ด์ง๋ฉด ์๋ฉ๋๋ค.
์ฆ, ๋ช ๊ฐ์ง ์ฌํญ์ ์ ์ฉํ๊ณ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ฐ์ ํ ์ ์๋์ง ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ์๋ฅผ ๊ฐ์ฌํ์ญ์์ค!
ํ์ง๋ง ์ ๋ง ...์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ๊ทธ๋ ๊ฒ ์๊ฐ์ ํฌ์ํด์ผํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์๋ํด์ผํ๊ณ PowerShell์ด โโ๊ฐ์ ๋ ๋๊น์ง ... ์๋ํฉ๋๋ค.
ํํ๊ฐ ๊ณ ํต์ด๋ผ๋ ๋ฐ ๋์ํ์ต๋๋ค. Windows ๋ฐ Linux์์ p / invoke๋ฅผ ํตํด ๋ค์ดํฐ๋ธ lib๋ก๋๋ฅผ ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ฃผ๋ ค๊ณ ํ์ต๋๋ค. :-)
@ vexx32 ํ ๋ก ์์ ๋ถํ ์ด ๋ณด์ ๋๋ค. ์ด๊ฒ์ด ๋ฌธ์ ๋ผ๋ ์ ์ ๋ช ํํ ํด์ฃผ์ค ์ ์์ต๋๊น? ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ์๋ ๋ชจ๋์ด ์๊ณ ํน์ ํ๋ซํผ์ ๋ํ ์ข ์์ฑ์ด์๋ ์ฌ๋ฐ๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ๋ก๋ํด์ผํฉ๋๊น?
์ผ์ข ์. ์ด๊ฒ์ ํ์ฌ ์๋ํ๋ ๋ ์ด์์์ด์ง๋ง ๋ชจ๋ ๊ฒ์ด ์ง์ ๋ถํฉ๋๋ค. p / invoke๋ฅผ ํตํด ๊ฒฝ๋ก๋ฅผ ์ ์ ํ ์์๋ ๊ฒ์ ๋ชจ๋ ๋ฃจํธ์ ์์ด์ผํฉ๋๋ค (์ผ๋ถ ํ๋ซํผ์์ ์ด๋ฆ ์ถฉ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ ํจ).
PSWordCloud/
|- PSWordCloudCmdlet.dll
|- SkiaSharp.dll
|- libSkiaSharp.so
|- libSkiaSharp.dylib
|- win-x86/
|- libSkiaSharp.dll
|- win-x64/
|- libSkiaSharp.dll
SkiaSharp.dll ์ .NET์ด๋ฉฐ ๋ด ์ฃผ cmdlet dll์ ๋ํ ์ฐธ์กฐ ์ด์ ๋ธ๋ฆฌ์ ๋๋ค. 4 ๊ฐ์ libSkiaSharp ํ์ผ์ ๊ธฐ๋ณธ ํ๋ซํผ ๋ณ DLL์ ๋๋ค. SkiaSharp.dll์ ์ฝ๋๋ฅผ ์ ์ดํ์ง ์๊ธฐ ๋๋ฌธ์ DLL์ด p / invokes ์ ์ ๊ฒฝ๋ก๋ฅผ ์ ๋ฐ์ดํธํ๋๋ก ๊ฐ์ ํ ์ ์์ต๋๋ค.
๊ทธ๋์ ... .NET ์ข ์์ฑ์ ๊ฐ์ง ๋ชจ๋์ด ์์ต๋๋ค. ์ด ์ข ์์ฑ์ DllImport๋ก๋ก๋ํ๋ ๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค. ์ ํํ ํ์ผ์ ํ๋ซํผ / ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค (๊ทธ๋ฌ๋ ์ผ๋ถ ํ์ผ์๋ ์ด๋ฆ ์ถฉ๋์ด ์์ผ๋ฏ๋ก ์ค์ ๋ก ์ง์ํ ์์๋ ํ๋ซํผ์ ์ ํํฉ๋๋ค).
@rkeithhill ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ฉด Linux ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ํ์ ํด๋๋ก ์ด๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. MacOS์ ๋ํด ํ์คํ์ง ์์ง๋ง ๋น์ทํ ๊ฒ์ด์์ ์ ์์ง๋ง ์์ง ๋ฐฉ๋ฒ์ ๋ํ ๋ฌธ์๋ฅผ ์ฐพ์ง ๋ชปํ์ต๋๋ค.
_ ์ด์์ ์ผ๋ก _, ์ด๋ฌํ ๋ชจ๋ ํ์ผ์ /PSWordCloud/runtime/<platform>/
์ ๊ฐ์ ํ์ ํด๋์ ์ต์
์ ์ํ ์ฌ์ผํฉ๋๋ค. ๋ชจ๋์ ํด๋๋ DllImport๋ฅผ ํตํด๋ก๋ ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์์น๋ ์๋ ํ ์ ์์ง๋ง (์ต์ํ Mac / Linux์์๋) ๊ธฐ๋ณธ ๋ฐํ์๋ก๋ ๊ฒฝ๋ก๋ฅผ ์ ์ํด์ผํ๋ ํ๋ซํผ์ ๋ชจ๋ ํ๊ฒฝ ๋ณ์๊ฐ PowerShell์์ ์์ ํ ๋ฌด์๋ฉ๋๋ค.
๋๋ $env:Path
์ฌ์ ํ ์๋ํ๋ค๊ณ ์๊ฐํ์ง๋ง (์ ๋์ค ํ๋ซํผ์์ ์ฌ์ฉํด์๋ ์๋๋ฉฐ 6.2 ๋ฆด๋ฆฌ์ค ์ดํ๋ก ํ
์คํธํ์ง ์์์ผ๋ฏ๋ก ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์) ์์งํ ๋๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ํด๋น ๋ณ์์ ๋ง์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋น ํ๊ฒฝ ๋ณ์๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ ์ ๋ง ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. ๋ชจ๋์๋ก๋ํ๊ณ ๊ฐ์๊ธฐ ๊ฒฝ๋ก ๋ณ์์์์ ์์๋ ์์์น ๋ชปํ ์ถ๊ฐ ๋ฐ์ดํฐ๊ฐ ์์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ค๋ฉด _has_ ์์ด์ผํฉ๋๋ค.
๋๋ ์ด๊ฒ์ด ๋ฌธ์ ๊ฐ๋์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. .NET Core์ ๋ฏธ๋ฆฌ ์ ์ ๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ ํ ๊ฒฝ์ฐ PowerShell์๋ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๋๋ณด๋ค ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ด ์์ด์ผํฉ๋๋ค. ๋ชจ๋ ๋งค๋ํ์คํธ์ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๊ฑฐ๋ ํด๋น ๋ผ์ธ์ ๋ฐ๋ผ ๋ฌด์ธ๊ฐ๋ฅผ ์ง์ ํ๋ ๋ฐฉ๋ฒ, ์ผ๋ถ ๋ค์ดํฐ๋ธ ์ฝ๋๋ฅผ p / ํธ์ถํด์ผ ํ ๋ ํ๋ซํผ๋ณ๋ก ์ฐพ์ ์์น๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
๋์ผํ ๋ฌธ์ ๊ฐ ์์ผ๋ฉฐ @ vexx32 ์ ๋ณด๊ณ ์์๋ ์ฒด์ธ์ ๋ชจ๋ ์์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.
PowerShell์ด โโ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ ๊ฐ๋ ฅํ ๋ฐฉ๋ฒ์ ๊ฐ์ ธ์ผํ๋ค๋ ๋ฐ ๋์ํฉ๋๋ค.
๋๋ ๊ทธ ๋ณ์์ ๋ง์ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ํ ์ข์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ํ๊ณ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ SetDllDirectory
๋ฅผ ์ฌ์ฉํ๋ ๋ฐ ์ด์คํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด (pwsh) ํ๋ก์ธ์ค ์ ์ฒด์ด๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ชจ๋ ๋งค๋ํ์คํธ๋ ๋ชจ๋ ์์ฑ์๊ฐ os-arch ์ฝค๋ณด๋ณ๋ก ๋ค์ดํฐ๋ธ dll ๋ชฉ๋ก์ ์ ๊ณต ํ ์ ์๋๋ก ์
๋ฐ์ดํธ ํ ์ ์์ผ๋ฉฐ, ๊ทธ๋ฌ๋ฉด pwsh๋ ์ด์
๋ธ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ๋ก๋ํ๊ธฐ ์ ์ ํด๋น ๋ค์ดํฐ๋ธ dll์ ๋ฏธ๋ฆฌ๋ก๋ํฉ๋๋ค. ๋๊ตฐ๊ฐ๊ฐ ์กฐ๋ฆฝ ์ ๋ง ๊ทธ ์์ ์ ๋ค์ดํฐ๋ธ DLL์ ๋ฏธ๋ฆฌ๋ก๋ํ๋ค, ๋ค๋ฅธ ์ธ์ด์์ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ๊ฒฝ์ฐ ์ฆ, ๋งํ๋ค. ์ด์
๋ธ๋ฆฌ ์ฌ์ฉ์๋ IMO๋ฅผ ์ํ ํ ํ์๊ฐ ์์ต๋๋ค.
@ vexx32 I "์๊ฐ" dlopen
๋ macOS์์๋ ์๋ํฉ๋๋ค.
ํ ์์์ ๋ ์๋ํด ๋ณด๊ฒ ์ต๋๋ค (mac VM์ ์ฝ๊ฐ ... ์ด์ํฉ๋๋ค).ํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ์์ Mac์ .so
ํ์ผ์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ์๋ํด ๋ณด๊ฒ ์ต๋๋ค. -Mac์์ ์ฐธ์กฐํ๋ ๋๋ถ๋ถ์ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ .dylib
๊ฒ ๊ฐ์ต๋๋ค.
์ด์ ๋ธ๋ฆฌ๋ ์ฌ๊ธฐ์์ ์์ฒด ์ฌ์ ๋ก๋๋ฅผ ์ํํฉ๋๋ค (์ ์ด๋ ํ์คํฉ๋๋ค ...). ์ด์ ๋ธ๋ฆฌ๊ฐ PS๊ฐ ๊ฒฝ๋ก๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๋ณผ ์์๋ ์์น๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ ํน์ ์ผ์ด์ค๋ก ์ฒ๋ฆฌํด์ผํฉ๋๋ค. : /
macOS๋ .dylib
ํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ์ ๋ ๋ค๋ฅธ ๋งคํฌ๋ก๋ก ํด๋น ์ด์
๋ธ๋ฆฌ๋ฅผ ์ธ ๋ฒ ์ปดํ์ผํด์ผํฉ๋๋ค.
public static class FooNativeMethods
{
// This unfortunately requires that you compile this assembly twice - once with WIN32 defined and again with
// it not defined.
#if WIN32
public const string LibName = "Foo";
#elif MACOS
public const string LibName = "libFoo.dylib";
#else
public const string LibName = "libFoo.so";
#endif
์ด๊ฒ์ netstandard2 ์ด์
๋ธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ํ๋ซํผ์ ๋ํด ์ด๊ฒ์ ๋ค์ ์ปดํ์ผ ํ ํ์๊ฐ ์์ ์ผ๋ฉดํฉ๋๋ค. ๊ทธ๋ฌ๋ AFAICT๋ DllImport
์์ฑ์ ์ ๊ณต๋ lib ์ด๋ฆ ๊ฐ์ด ์ปดํ์ผ ์๊ฐ ์์ ์ฌ์ผํฉ๋๋ค. :-(
๋ค. ์ด๊ฒ์ PowerShell ๋ชจ๋์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ์ํ ํ ์์
์ ํ๋ซํผ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ์ฌ Add-Type -TypeDefinition $srcString
์ฌ์ฉํ์ฌ ๊ฐ์ ธ ์ค๊ธฐ์ ๋์ ์ปดํ์ผ์ ์ํ ํ ๋ค์ ์ฌ๋ฐ๋ฅธ ๋๋ ํฐ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒ์
๋๋ค. ๊ณ ๋ง๊ฒ๋ ๋ชจ๋ ๋งค๋ํ์คํธ์์ ScriptsToProcess
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ libdl.so
๋ MacOS์์์ด ์์
์ ์ํ ํ ์์๋ ์ ํจํ๊ณ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๊น?
ํ์ง๋ง ๋ ๋์ ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. ๐
@ vexx32 ๋ชจ๋ ธ MapDll ๋ณด์ จ๋์? ์ด ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ์กฐ๊ฑด (์์น, ํ๋ซํผ ๋ฑ)์ ๋ฐ๋ผ ์ ์ ํ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์๋ ๋งคํ ํ ์ ์์ต๋๋ค. ๋๋ ๋น์ ์ด ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. SkiaSharp.dll์ ๋ค์ ์ปดํ์ผํด์ผํ์ง๋ง ์ธ๋ถ ๊ตฌ์ฑ ํ์ผ์์ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค. ์ ์ฌํ ๊ฒ์ด Core์์ ๊ตฌํ๋ฉ๋๋ค.
์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ฉด .NET Core๋ Windows์์ ์คํํ ๋ Mono๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๋ค์ ๋ถ๋ถ์ ์ธ ์๋ฃจ์ ์ผ๋ฟ์ ๋๋ค.
์ฌ๊ธฐ์ ์ ๊ณต๋๋ ๋ชจ๋ ์ต์ ์ ๊ฐ์ฌ ๋๋ฆฌ๋ฉฐ ํ์ฌ ์ต์ ์ด ๋ฌด์์ธ์ง ์ฒ ์ ํ ์กฐ์ฌ ํ ๊ฒ์ ๋๋ค.ํ์ง๋ง ๊ฒฐ๊ตญ์๋ PowerShell์ด์ด ๋ชฉ์ ์ ์ํด ์ฌ์ฉํ ํฌ๋ก์ค ํ๋ซํผ ๋ชจ๋์์ํ ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ จํด์ผํฉ๋๋ค. . ๐
์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ฉด .NET Core๋ Windows์์ ์คํํ ๋ Mono๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก ๋ค์ ๋ถ๋ถ์ ์ธ ์๋ฃจ์ ์ผ๋ฟ์ ๋๋ค.
๋๋ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ํด ๋งํฉ๋๋ค. ๋ณด๋ค
Dllmap ๋์์ธ ๋ฌธ์ https://github.com/dotnet/coreclr/blob/c3e1bd5ccc482c9a7670762676bda95ebd34707d/Documentation/design-docs/dllmap.md
๋ฐ ์ด์ ๋ฒ์ ์ ๋ฌธ์
https://github.com/dotnet/coreclr/blob/6a48f05c77e80b604d71a9b84cc6b014306e849e/Documentation/design-docs/dllmap.md#
์
๋ฐ์ดํธ : CurrentContextualReflectionContext
https://github.com/dotnet/designs/blob/master/accepted/runtime-binding.md#rollforward
๋ฟก๋ฟก
์ด๊ฒ์ netstandard2 ์ด์ ๋ธ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ ํ๋ซํผ์ ๋ํด ์ด๊ฒ์ ๋ค์ ์ปดํ์ผ ํ ํ์๊ฐ ์์ ์ผ๋ฉดํฉ๋๋ค. ๊ทธ๋ฌ๋ AFAICT DllImport ์์ฑ์ ์ ๊ณต๋ lib ์ด๋ฆ ๊ฐ์ ์ปดํ์ผ ์๊ฐ ์์ ์ฌ์ผํฉ๋๋ค. :-(
FWIW DllImport
๋ํ ํ์ฅ์๋ฅผ ์๋ต ํ ์ ์์ต๋๋ค. PSES์ ๋น Windows ๊ธฐ๋ณธ ์ข
์์ฑ์ ๋ํด ๊ทธ๋ ๊ฒํฉ๋๋ค. ๊ธฐ๋ณธ ์ด๋ฆ์ด ๋์ผํ์ง ์์ผ๋ฉด ๋์์ด๋์ง ์์ต๋๋ค.
๋ณ๋์ ์ธํฐํ์ด์ค ๊ตฌํ์ ์ ์ฅํ์ฌ LoadLibrary
/ dlopen
ํธ์ถ์ ๋ํ ์ปดํ์ผ๋ฌ ์ง์๋ฌธ์ ๊ฑด๋ ๋ธ ์๋ ์์ต๋๋ค. ๋ฉ์๋๊ฐ JIT๊ฐ ์๋ ํ ๋ฐํ์์ ๋์ ธ์๋ ์๋ฉ๋๋ค.
์ด ๋ฌธ์ ์ ๋ํ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ ์ ์ฐพ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์๋ํด์ผ ํ ๊ฒ์ ๋๋ค. ํ์ฌ ์ผ๋ถ ๋ฆด๋ฆฌ์ค ์์ ์ ๋ฐ์๊ธฐ ๋๋ฌธ์ ๋ค์ ์ฃผ ์ด์์ด ์์ ์ ์ํ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌ ํ ๋ด์ฉ์ผ๋ก ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
@adityapatwardhan LoadLibrary / dlopen์ ๋๋ฌ์ผ ํฌ๋ก์ค ํ๋ซํผ ๋ํผ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ข์ ๋ฐ๊ฒฌ!
@adityapatwardhan LoadUnmanagedDll ์์์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค. ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ๋ณ ์๋ฏธ๊ฐ ์์ ์๋ ์์ต๋๋ค.
์ฌ๋๋ค์ด ๊ด๋ฆฌ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ฌ์ฉ์ ์ง์ ํด๊ฒฐ ์ ์ฑ ์ ์ ๊ณต ํ ์ ์๋๋ก ์ฝ๋ฐฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ณ ๋ คํด์ผํฉ๋๋ค. AssemblyLoadContext.LoadUnmanagedDll์ ์ฌ์ฉํ์ฌ์ด๋ฅผ ์ํํ๋ ค๊ณ ํ์ต๋๋ค. ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๋ก๋ ์ปจํ ์คํธ์์ ์๋ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ์ผ๋ถ๋ง ํด๊ฒฐํ์ต๋๋ค. ์๋ AssemblyLoadContext.LoadUnmanagedDll์ ๋์ ํ์ ๋ ๊ธฐ๋ณธ๋ก๋ ์ปจํ ์คํธ๋ ์ฌ์ ์ ํ ์ ์์์ง๋ง์ด ๊ธฐ๋ฅ์ ์ ๊ฑฐํ๊ณ ๋ชจ๋ ์๋๋ฆฌ์ค์ ๋ฏธ์น๋ ์ํฅ์ ๊ณ ๋ คํ์ง ์์์ต๋๋ค.
์์ NativeLibrary API ๋งํฌ๊ฐ ํฌ๋ก์ค ํ๋ซํผ ์๋ฃจ์ ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค (.Net Core 3.0์ผ๋ก ์ด๋ ํ ํ).
CurrentContextualReflectionContext https://github.com/dotnet/coreclr/blob/master/Documentation/design-docs/AssemblyLoadContext.ContextualReflection.md
ํ๋ฌ๊ทธ์ธ ๋ชจ๋ธ ์ฉ์
๋๋ค. ์ด๋ ๊ฒํ๋ฉด # 6724, # 6426 ๋ฑ์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ ๋ ์ ์์ต๋๋ค.
/ cc @ daxian-dbw
@adityapatwardhan ์ง๋๋ฌ ์ดํ์ ์ ๋ฐ์ดํธ๊ฐ ์์ต๋๊น? ์ด์ ๋ํ ์ฌ๋ฐ๋ฅธ ๋ฌธ์ ์ง์นจ์ ๊ฒ์ํ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ ์ง์คํ ์ ์์๊ณ , ํ์ฌ ๋ค๋ฅธ ๋์ ์ฐ์ ์์ ํญ๋ชฉ์ผ๋ก ๋ฐ์๋ค. ๋ค์ ์ฃผ์ ์ ๋ฐ์ดํธํ๊ฒ ์ต๋๋ค.
@adamdriscoll ์ ์๋ง๋ UniversalDashboard ๋ฐ AvaloniaUI + PowerShell์์ ์ฐฝ์์ ์ธ ์์ ์ ์ํํด์ผํ๊ธฐ ๋๋ฌธ์ ์กฐ์ธ์ ํด์ค ์์์ ๊ฒ์ ๋๋ค.
FWIW ์์์ ์ ์ dlopen
pinvoke๋ฅผ ์กฐ์ ํ๊ณ Mac์์ ๊ณต์ lib์ ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ ์ธ์๋ ์๋ํฉ๋๋ค. ์ด๊ฒ์ .NET Core 2.2์ ์์ต๋๋ค.
UD๋ @rkeithhill ์ ์๋ฃจ์ ๊ณผ ์ํ ํฉ๋๋ค. ์ด๊ฒ์ Linux ๋ฐ Windows๋ฟ๋ง ์๋๋ผ MacOSX์์๋ ์๋ํฉ๋๋ค. https://github.com/ironmansoftware/universal-dashboard/blob/master/src/UniversalDashboard/Server/CustomAssemblyLoadContext.cs
๋ฌธ์ ๋ ๋ค์ํ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๊ธฐ ์ํด ํด๋ ๊ฒฝ๋ก์ ๋ ๋ง์ ๋ณํ์ด์์ ์ ์์ผ๋ฏ๋ก ์ฝ๊ฐ์ kluge์ ๋๋ค. ์ ์ด์ง ์ ํ์ด ์ ์ข ์์ฑ์ ๊ธฐ๋ฐ์ผ๋ก ์ถ๋ ฅ๋๋ ๊ฒฝ์ฐ ์ ํด๋๊ฐ ํ์ ๋๊ณ UD๊ฐ ์ด์ ๋ธ๋ฆฌ๋ฅผ๋ก๋ํ์ง ์์ต๋๋ค.
@rkeithhill ๋ชจ๋ WindowsLinux ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋จ์ผ ํด๋๋ก ๋ณํฉํ๊ณ ์์ต๋๊น? (ํธ์ง : ์ฌ์ค, ์๊ฒ ์ต๋๋ค. ๋์ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ ๋ง๋ก๋ํ๋ ๋ํผ DLL ์ด์ ๋ธ๋ฆฌ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ์ ๋ํด์ด ์์ ์ ์ํํฉ๋๊น?)
UD๋ ๊ฒ์ ๋ฐํ์ ํด๋๋ฅผ dotnet publish๋ก ์์ฑํ์ ๋์ ๋์ผํ๊ฒ ์ ์ง ํ ๋ค์ ์ฐธ์กฐ ๋ ํด๋์ค๊ฐ ์ฌ๋ฐ๋ฅธ ํ๋ซํผ ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค.
์๋ํ์ง๋ง PS๊ฐ ๋ฐํ์ ํด๋๋ฅผ๋ณด๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. dotnet์ด ์์๋ ๋ ๊ทธ๋ ๊ฒ ํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์ฝ๋๊ฐ์์ ์ ์์ต๋๋ค.
๊ฒฐ๊ณผ RuntimeInformation.IsOSPlatform(OSPlatform.Windows)
์ ๋ฐ๋ผ ๋ค์ดํฐ๋ธ ์ด์
๋ธ๋ฆฌ๋ฅผ ์ฐพ๋ ์์น๋ฅผ ๋ณ๊ฒฝํฉ๋๋ค. true๊ฐ ๋ฐํ๋๋ฉด C # ์ด์
๋ธ๋ฆฌ๊ฐ์๋ ๋๋ ํฐ๋ฆฌ์ Windows
ํด๋์์๋ก๋ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด Linux
ํด๋์์๋ก๋ํฉ๋๋ค.
๋ชจ๋ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ์ ๋ํด์ด ์์ ์ ์ํํฉ๋๊น?)
์,ํ์ง๋ง ์ฐ๋ฆฌ๋ ํ๋๋ง ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (msvcrt ๋ฑ) ์ด์ธ์ ๋ค๋ฅธ ๊ฒ์ ์์กดํ์ง ์์ต๋๋ค.
ํ์ค ํ์ผ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ์์ต๋๊น (๋ฐํ์ ์ด๋ฆ์ ๊ธฐ๋ฐ์ผ๋ก ํ ์ ์์)? ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋ค์ดํฐ๋ธ dll ๋ฆฌ์กธ๋ฒ๋ฅผ ํฅ์์ํฌ ์ ์๋๋กํฉ๋๋ค.
UD๋ ๊ฒ์ ๋ฐํ์ ํด๋๋ฅผ dotnet publish๋ก ์์ฑํ์ ๋์ ๋์ผํ๊ฒ ์ ์ง ํ ๋ค์ ์ฐธ์กฐ ๋ ํด๋์ค๊ฐ ์ฌ๋ฐ๋ฅธ ํ๋ซํผ ์ํคํ ์ฒ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋ ค๊ณ ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์๋ค๋ฉด RID ๋ณ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ์ ์์กดํ๋ ๊ด๋ฆฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ ํ ๋ .NET์ด ๋ด๋ถ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋๋กํจ์ผ๋ก์จ PowerShell์ ์ฌ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ ๋๊น?
์๋ํ์ง๋ง PS๊ฐ ๋ฐํ์ ํด๋๋ฅผ๋ณด๊ณ ์ฌ๋ฐ๋ฅธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. dotnet์ด ์์๋ ๋ ๊ทธ๋ ๊ฒ ํด์ผํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ฏ๋ก ๊ฑฐ๊ธฐ์ ์ฝ๋๊ฐ์์ ์ ์์ต๋๋ค.
์, .NET ๋ฐํ์ ์์ฒด์์ ๋ฐ์ํ๋ RID ์ธ์์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ธธ๋ก ๊ฐ์ผํ๋ ๊ฒ์ ํผํ๋ ค๊ณ ๋ ธ๋ ฅํด ์์ง๋ง, ์ธ์ ๊ฐ๋ ๊ทธ๋ด ํ์๊ฐ์์ ๊ฒ ๊ฐ๋ค.
ํํ
๋ฐ๋ผ์ ๋ด๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ดํดํ๊ณ ์๋ค๋ฉด RID ๋ณ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ์ ์์กดํ๋ ๊ด๋ฆฌ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ ํ ๋ .NET์ด ๋ด๋ถ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋๋กํจ์ผ๋ก์จ PowerShell์ ์ฌ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ๋ฐ์ด๋๋ฆฌ๋ฅผ๋ก๋ํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ ๋๊น?
์ ๋ฐ๋ก ๊ทธ ๊ฑฐ์์. UD๋ ๋์ RID์ ๋ํ ๋ชจ๋ ๊ฒ์๋ก๋ํฉ๋๋ค. ๋ฐ๋ผ์ ์ค์ ์ข ์์ฑ์ด ๋ฌด์์ธ์ง์ ๋ํด์๋ ์ค์ ๋ก ํ๋ช ํ์ง ์์ต๋๋ค. ๊ทธ๊ฒ์ ๊ฐ์งํ๋ ์ข์ ๋ฐฉ๋ฒ์ด ์๋์ง ํ์คํ์ง ์์ต๋๋ค.
@ vexx32 PSWordCloud๋ฅผ ์ค์นํ์ต๋๋ค. ํด๋ ๊ตฌ์กฐ๊ฐ ์ผ๋ฐ์ ์ธ๊ฐ์? ๊ทธ๋ ๋ค๋ฉด ๋ฆฌ์กธ๋ฒ๋ฅผ ๋ ๋๋ํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ ๊ฐ ๋ฌผ์ด๋ณด๊ณ ์ถ์ ๊ฒฝ์ฐ์-๋จ์ํ ๋ PSWordCloud๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์๋ก์ด Pester ํ ์คํธ๋ฅผ ์ค๋นํด ์ฃผ์๊ฒ ์ต๋๊น ( "Hello World"์ ๊ฐ์ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ๋จํ ๊ฒ์ ์ป์ ์์๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํฉ๋๋ค)? ์ด๋ฅผ ๋ณด๋ฅ ์ค์ผ๋ก ๋ณํฉํ๋ฉด ๋ฆฌ์กธ๋ฒ์์ ์์ ํ ์์๋ ๋ฐฉ๋ฒ์ด ์ด๋ฆฝ๋๋ค. ๊ฐ์ฌ!
ํ์ฌ PSWordCloud์ ํด๋ ๊ตฌ์กฐ๋ ์ผ๋ฐ์ ์ด์ง ์์ต๋๋ค. ๋ฌผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ค, ๊ฐ๋จํ ์ํ๋๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Pester๋ ๋ด๊ฐ ์๊ฐํ๋ ์ถ๋ ฅ์ ํน์ฑ์ ๋ฐ๋ผ ์ฝ๊ฐ ๊น๋ค ๋กญ์ง ๋ง ์คํจํ๋ฉด ์ก์ ์์๋ ์์ธ๋ฅผ ์์ฑํ์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ๊ธฐ์ตํ๋ฉด ํด๋น ์์ธ๊ฐ ์ ํ ์ด๋์ ๋ผ์ด์ ์์ throw๋ฉ๋๋ค.
ํ ์คํธ ์์ฒด๊ฐ dotnet์ ํตํด Skia DLL์ ๊ฐ์ ธ ์ค๋ ๊ฒ์ด ์ ์ ํ ๊น์, ์๋๋ฉด ๋ฆฌํฌ์งํ ๋ฆฌ์ ํจํค์งํ๋ ๊ฒ์ด ๋ ์ข์๊น์? ๋ ์ด์ ๋ณด๋ฅ ์ค์ด ์๋๋ผ๋ฉด ๊ธฐ๋ฅ ํ ์คํธ๋ก ํ์๋๋ฉด ๊ทธ๋ ๊ฒ ํฐ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. :์๊ฐ:
Skia dll๊ณผ ๊ฐ์ ์ ์ธ ์์กด์ฑ์ ๊ฐ์ง ํ
์คํธ ๊ฒฐ์ ์ ๊ตฌํํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์, Nuget์์ Skia๋ฅผ ์ค์นํ ์ ์์ต๋๋ค. ํ
์คํธ ๋ชจ๋๊ณผ ํจ๊ป dll์ ~ our test module folder ~ assert ํด๋์ ์ง์ ๋ฃ์ผ๋ฉด ํ
์คํธ๊ฐ ๋ ์ ๋ขฐํ ์ ์์ต๋๋ค.
Nuget์ ๋ชจ๋ฒ ์ฌ๋ก๋ RID๋ผ๋ ์ด๋ฆ์ ํด๋์ ๋ค์ดํฐ๋ธ dll์ ๋ฃ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์?
๋ค, ํ ์ ์์ต๋๋ค! ๋ด์ผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. :๋ถํ๋ค:
๋ด ์๊ฒฌ์ ์ ๋ฐ์ดํธํ์ต๋๋ค. ํ ์คํธ ๋ชจ๋์ ํ ์คํธ ์ด์ค ์ ํด๋์ ๋ฃ์ผ์ญ์์ค.
@rjmholt PSWordCloud์์ ์๋ํ๋๋ก ์ ๊ณต ํ ์ฝ๋๋ฅผ ์ฌ์ฉํ๋ ค๊ณ ์๋ํ์ง๋ง ์ฌ์ ํ ์ ํ ์๋ํ์ง ์์ต๋๋ค. ๋ก๋ ์์ ์ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋์ง๋ง ๊ด๋ฆฌ๋์ง ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ Unix ํ๋ซํผ์์๋ก๋ ๋ DLL์ ์ฌ์ฉํ๋ ๋ฐ ์ฌ์ ํ ์คํจํ ํ ๊ด๋ฆฌ๋๋ SkiaSharp.dll์๋ก๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ป๊ฒ ๋ Windows์์ ์๋ํฉ๋๋ค.
https://github.com/vexx32/PSWordCloud/tree/FixPInvokes-$ build.ps1
๋ฅผ ์คํํ์ฌ ๋ชจ๋์ ๋น๋ํ๊ณ ๋ชจ๋ ํ์ผ์ ์ฌ๋ฐ๋ฅธ ์์น์ ๋ฐฐ์นํ์ญ์์ค. ๋ชจ๋๋ ๊ฐ์ ธ์ต๋๋ค. ๋น๋๋ฅผ ์คํ ํ ํ New-WordCloud
ํธ์ถ์ Windows์์ ์๋ํ์ง๋ง Mac OS์์๋ ์์ ํ ์คํจํฉ๋๋ค.
@SeeminglyScience ๋น์ ์ ๋ด๊ฐ ๊ฑฐ๊ธฐ์์ ์๋ชปํ ๊ฒ์
GitHubPowerShell๋ก ์์ ๋จ์ด ๊ตฌ๋ฆ์ ๋ง๋์ธ์! GitHub์์ ๊ณ์ ์ ๋ง๋ค์ด vexx32 / PSWordCloud ๊ฐ๋ฐ์ ๊ธฐ์ฌํ์ธ์.
@ SteveL-MSFT ํ์ฌ ๋ค์ดํฐ๋ธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ์ํ ๊ณํ์ ๋ฌด์์ ๋๊น? ๐
: tada :์ด ๋ฌธ์ ๋ # 11032์์ ํด๊ฒฐ๋์์ผ๋ฉฐ ํ์ฌ v7.0.0-rc.1
. : tada :
ํธ๋ฆฌํ ๋งํฌ :
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ฟก๋ฟก
FWIW
DllImport
๋ํ ํ์ฅ์๋ฅผ ์๋ต ํ ์ ์์ต๋๋ค. PSES์ ๋น Windows ๊ธฐ๋ณธ ์ข ์์ฑ์ ๋ํด ๊ทธ๋ ๊ฒํฉ๋๋ค. ๊ธฐ๋ณธ ์ด๋ฆ์ด ๋์ผํ์ง ์์ผ๋ฉด ๋์์ด๋์ง ์์ต๋๋ค.๋ณ๋์ ์ธํฐํ์ด์ค ๊ตฌํ์ ์ ์ฅํ์ฌ
LoadLibrary
/dlopen
ํธ์ถ์ ๋ํ ์ปดํ์ผ๋ฌ ์ง์๋ฌธ์ ๊ฑด๋ ๋ธ ์๋ ์์ต๋๋ค. ๋ฉ์๋๊ฐ JIT๊ฐ ์๋ ํ ๋ฐํ์์ ๋์ ธ์๋ ์๋ฉ๋๋ค.