Powershell: ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋“œ๊ฐ€ ์ค‘๋‹จ๋จ

์— ๋งŒ๋“  2019๋…„ 04์›” 27์ผ  ยท  70์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: PowerShell/PowerShell

ํƒ€์‚ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ 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

Issue-Question Resolution-Fixed

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋ฟก๋ฟก

์ด๊ฒƒ์€ netstandard2 ์–ด์…ˆ๋ธ”๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•ด ์ด๊ฒƒ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผ ํ•  ํ•„์š”๊ฐ€ ์—†์—ˆ ์œผ๋ฉดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ AFAICT DllImport ์†์„ฑ์— ์ œ๊ณต๋œ lib ์ด๋ฆ„ ๊ฐ’์€ ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ์ƒ์ˆ˜ ์—ฌ์•ผํ•ฉ๋‹ˆ๋‹ค. :-(

FWIW DllImport ๋Œ€ํ•œ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žต ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PSES์˜ ๋น„ Windows ๊ธฐ๋ณธ ์ข…์†์„ฑ์— ๋Œ€ํ•ด ๊ทธ๋ ‡๊ฒŒํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ด๋ฆ„์ด ๋™์ผํ•˜์ง€ ์•Š์œผ๋ฉด ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์— ์ €์žฅํ•˜์—ฌ LoadLibrary / dlopen ํ˜ธ์ถœ์— ๋Œ€ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์„ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๊ฐ€ JIT๊ฐ€ ์•„๋‹Œ ํ•œ ๋Ÿฐํƒ€์ž„์— ๋˜์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  70 ๋Œ“๊ธ€

@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๋ณด๋‹ค ๋” ๋‚˜์€ ๊ฒƒ์„ ์›ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๋‚ด ์†”๋ฃจ์…˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. Mac ๋ฐ Linux ์šฉ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ชจ๋“ˆ ๋ฃจํŠธ์— ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๋ฃจํŠธ๊ฐ€ ๋‚ด๊ฐ€ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ˜„์žฌ ์•ˆ์ •์ ์œผ๋กœ๋กœ๋“œ ํ•  ์ˆ˜์žˆ๋Š” ์œ ์ผํ•œ ์žฅ์†Œ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  2. ScriptsToProcess ๋Š” ๋ชจ๋“ˆ ๊ฐ€์ ธ ์˜ค๊ธฐ์—์„œ p / invoke๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ 32 ๋น„ํŠธ ๋˜๋Š” 64 ๋น„ํŠธ ๋ฒ„์ „์˜ Windows ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํŒŒ์ผ ์ด๋ฆ„์ด ๋™์ผํ•˜๋ฏ€๋กœ ํ•˜์œ„ ํด๋”์— ์ €์žฅ๋˜์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ด์ƒ์ ์ด์ง€ ์•Š๊ณ  @TylerLeonhardt ๊ฐ€ ์˜ค๋Š˜๋‚  ๊ทธ์˜ ์ŠคํŠธ๋ฆผ์—์„œ ์ฆ๋ช…ํ•  ์ˆ˜

@ vexx32 ๋Š” ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. PowerShell์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” C #์—์„œ ์žฌํ˜„์„ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด CoreCLR repo์—์„œ ๋ฌธ์ œ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์•„๋‹ˆ์š” : C #์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

C #์—์„œ๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ํ”Œ๋žซํผ๋ณ„๋กœ _ ๋ณ„๋„์˜ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ _์„ ๋ฆด๋ฆฌ์Šคํ•˜๊ณ  ๊ฑฑ์ •ํ•  _ ํ•˜๋‚˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒ€์ƒ‰ ๊ฒฝ๋กœ _ ๋งŒ ์žˆ์œผ๋ฉด๋ฉ๋‹ˆ๋‹ค.
  2. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๊ณ  _NuGet ํŒจํ‚ค์ง€ _๋ฅผ ๋ฆด๋ฆฌ์Šคํ•˜๋ฉด nuget์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฐ์น˜ ํ•  ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ๊ฒฝ๋กœ ํŒจํ„ด์„ ์ œ๊ณตํ•˜๋ฉด studio / msbuild๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

@ 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๊ฐ€ ์•„๋‹Œ ํ•œ ๋Ÿฐํƒ€์ž„์— ๋˜์ ธ์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ€๋Šฅํ•œ ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์‹œ๋„ํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ผ๋ถ€ ๋ฆด๋ฆฌ์Šค ์ž‘์—…์— ๋ฐ”์˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์ฃผ ์ดˆ์—์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌ ํ•œ ๋‚ด์šฉ์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.loader.assemblyloadcontext.loadunmanageddll?view=netcore-2.2#System_Runtime_Loader_AssemblyLoadContext_LoadUnmanagedDll_System_String_

@adityapatwardhan LoadLibrary / dlopen์„ ๋‘˜๋Ÿฌ์‹ผ ํฌ๋กœ์Šค ํ”Œ๋žซํผ ๋ž˜ํผ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์ข‹์€ ๋ฐœ๊ฒฌ!

@adityapatwardhan LoadUnmanagedDll ์—์„œ์ด ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” ๋ณ„ ์˜๋ฏธ๊ฐ€ ์—†์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ํ•ด๊ฒฐ ์ •์ฑ…์„ ์ œ๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝœ๋ฐฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. AssemblyLoadContext.LoadUnmanagedDll์„ ์‚ฌ์šฉํ•˜์—ฌ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๋กœ๋“œ ์ปจํ…์ŠคํŠธ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์˜ ์ผ๋ถ€๋งŒ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๋ž˜ AssemblyLoadContext.LoadUnmanagedDll์„ ๋„์ž…ํ–ˆ์„ ๋•Œ ๊ธฐ๋ณธ๋กœ๋“œ ์ปจํ…์ŠคํŠธ๋„ ์žฌ์ •์˜ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ์ด ๊ธฐ๋Šฅ์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : .so ํŒŒ์ผ์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ์ถœ๋ ฅ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์— ์žˆ์œผ๋ฉด Linux์—์„œ LoadUnmanagedDllFromPath / 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 ๋‹น์‹ ์€ ๋‚ด๊ฐ€ ๊ฑฐ๊ธฐ์—์„œ ์ž˜๋ชปํ•œ ๊ฒƒ์„

GitHub
PowerShell๋กœ ์˜ˆ์œ ๋‹จ์–ด ๊ตฌ๋ฆ„์„ ๋งŒ๋“œ์„ธ์š”! GitHub์—์„œ ๊ณ„์ •์„ ๋งŒ๋“ค์–ด vexx32 / PSWordCloud ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜์„ธ์š”.

@ SteveL-MSFT ํ˜„์žฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ์œ„ํ•œ ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๐Ÿ˜•

: tada :์ด ๋ฌธ์ œ๋Š” # 11032์—์„œ ํ•ด๊ฒฐ๋˜์—ˆ์œผ๋ฉฐ ํ˜„์žฌ v7.0.0-rc.1 . : tada :

ํŽธ๋ฆฌํ•œ ๋งํฌ :

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰