.NET рдлреНрд░реЗрдорд╡рд░реНрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд▓рд┐рдирдХреНрд╕ рдХрдВрдЯреЗрдирд░ (рдЬрдм .Net рдХреЛрд░ рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ)

рд╣реЗрд▓реЛ, рд╣реИрдмрд░ред

рдореИрдВ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рджреБрдирд┐рдпрд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдЬреЛ рдореБрдЭреЗ рдХрд╛рдлреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдиреАрдЪреЗ рд╡рд░реНрдгрд┐рдд рд╕реНрдерд┐рддрд┐ рд╕реЗ рдмрд╛рд╣рд░ рдХрд╛ рдЖрджрд░реНрд╢ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд░рд╛рджрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕реЗрдЯрд┐рдВрдЧ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐


рдХрд╛рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдп рдерд╛: рдЖрдкрдХреЛ рд╕рд╛рдЗрдЯ рдкрд░ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ, рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ, рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдмреАрдЖрдИрдПрдо рдореЙрдбрд▓ рдХреЗ 3 рдбреА рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреБрдЫ рд╣рд▓реНрдХрд╛, рд╕реАрдзреА рдЬрд░реВрд░рдд рд╣реИред

рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░, рдЗрди рд╡рд╕реНрддреБрдУрдВ рдХреЗ рдореЙрдбрд▓ рд╡рд┐рднрд┐рдиреНрди рд╕реАрдПрдбреА рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдХреЗ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдФрд░ 3 рдбреА рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЦреБрд▓реЗ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдФрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЙрдирдореЗрдВ рд╕реЗ IFC рдкреНрд░рд╛рд░реВрдк рд╣реИ ред рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рд╡рд┐рдХрд▓реНрдкреЛрдВ рдФрд░ рдЗрд╕рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ


рдФрдкрдЪрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ, рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХрд┐рд╕реА рд╡реЗрдм рдкреЗрдЬ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ * .ifc рдХрдирд╡рд░реНрдЯрд░ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдпрдВ рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реАрдВ рд╕реЗ рдореЗрд░реА рд╢реБрд░реБрдЖрдд рд╣реБрдИред

рдПрдХ рдЕрджреНрднреБрдд рдЯреВрд▓рдХрд┐рдЯ, xBIM рдЯреВрд▓рдХрд┐рдЯ рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рд░реВрдкрд╛рдВрддрд░рдг рдХреЗ рд▓рд┐рдП рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ ред

рдЗрд╕ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗрдм рдкреНрд░рд╛рд░реВрдк рдХреЗ рд▓рд┐рдП IFC рдФрд░ * .wexBIM рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, * .if рдХреЛ * .wexBIM рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ:
using System.IO;
using Xbim.Ifc;
using Xbim.ModelGeometry.Scene;

namespace CreateWexBIM
{
    class Program
    {
        public static void Main()
        {
            const string fileName = "SampleHouse.ifc";
            using (var model = IfcStore.Open(fileName))
            {
                var context = new Xbim3DModelContext(model);
                context.CreateContext();

                var wexBimFilename = Path.ChangeExtension(fileName, "wexBIM");
                using (var wexBiMfile = File.Create(wexBimFilename))
                {
                    using (var wexBimBinaryWriter = new BinaryWriter(wexBiMfile))
                    {
                        model.SaveAsWexBim(wexBimBinaryWriter);
                        wexBimBinaryWriter.Close();
                    }
                    wexBiMfile.Close();
                }
            }
        }
    }
}


рдЕрдЧрд▓рд╛, рдкрд░рд┐рдгрд╛рдореА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ "рдкреНрд▓реЗрдпрд░" xBIM WeXplorer рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдПрдХ рдкреГрд╖реНрда рдореЗрдВ * .wexBIM рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Hello building!</title>
    <script src="js/xbim-viewer.debug.bundle.js"></script>
</head>
<body>
    <div id="content">
        <canvas id="viewer" width="500" height="300"></canvas>
        <script type="text/javascript">
            var viewer = new xViewer('viewer');
            viewer.load('data/SampleHouse.wexbim');
            viewer.start();
        </script>
    </div>    
</body>
</html>


рдареАрдХ рд╣реИ рдЪрд▓рддреЗ рд╣реИрдВред рдореИрдВ xBIM рд╕реЗ рдирдЧреЗрдЯреНрд╕ рд▓реЗрддрд╛ рд╣реВрдВред рдореИрдВ рдПрдХ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдВ рдЬреЛ * .ifc рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрдереЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрдирдХреЗ рдмрдЧрд▓ рдореЗрдВ рдпрд╣ * .wexBIM рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рд╕рд╛рдЗрдЯ рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ ... рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдПрдХ рдкреНрд░рдХрд╛рд░ рдХреА рд╕реЗрд╡рд╛ рдмрди рдЬрд╛рдП, рдЬреЛ рдкреЛрд░реНрдЯрд▓ рдкрд░ * .ifc рдЕрдкрд▓реЛрдб рдИрд╡реЗрдВрдЯ рдкрд░ рддреБрд░рдВрдд рдЖрд╡рд╢реНрдпрдХ * .wexBIM рдмрдирд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рддреБрд░рдВрдд рддреИрдпрд╛рд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдореИрдВ рдирдИ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдВ рдмрдирд╛рддрд╛ рд╣реВрдВ:

  1. рд░реВрдкрд╛рдВрддрд░рдг рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ RabbitMQ рд╕реЗ рдЖрддреЗ рд╣реИрдВ ;
  2. рдореИрдВ рдЦреБрдж рдХреЛ рдПрдХ рдмрд╛рдЗрдирд░реА рд╕рдВрджреЗрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдмреЙрдлрд╝ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдЧ рджреНрд╡рд╛рд░рд╛ deserialization рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ ;
  3. рдХрд╛рд░реНрдп рдореЗрдВ рд╕реНрд░реЛрдд рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реЛрдЧрд╛ред * рд╣рдорд╛рд░реЗ Minio рд╕реЗ .cc рдлрд╝рд╛рдЗрд▓ ;
  4. рдХрд╛рд░реНрдп рдореБрдЭреЗ рдпрд╣ рднреА рдмрддрд╛рдПрдЧрд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП Minio рдореЗрдВ рдХреМрди рд╕реА рдмрд╛рд▓реНрдЯреА рд╣реИ;
  5. рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдХреЗрд╡рд▓ .net core 3.1 рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдирд┐рд░реНрдорд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рд╣рдорд╛рд░реЗ "docker farm" рдкрд░ рд▓рд┐рдирдХреНрд╕ docker рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдХрд╛рдо рдХрд░реЗрдВ;

рдкрд╣рд▓реА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдФрд░ рд╕рдореНрдореЗрд▓рдиреЛрдВ


рдореИрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд╣рд▓реЗ 4 рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд╢рд╛рдпрдж рдмрд╛рдж рдореЗрдВред

рдиреМрдХрд░реА рдХреА рдХрддрд╛рд░ рдХреЛ рд╕реБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрди рдХрд╛ рдХрд╛рд░рдг рдмрдирддрд╛ рд╣реИ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдиреМрдХрд░реА рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╣рд╕рдВрдмрдВрдзреА рдЖрдИрдбреА рд╕реЗ ред рдкреНрд░реЛрдЯреЛрдмреЙрдл рд╕реЗ рдЙрддреНрдкрдиреНрди рдЕрдиреБрд░реЛрдз / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛ред рдорд┐рдирд┐рдпреЛ рдореЗрдВ рдлрд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб / рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рдпрд╛ ред

рдпрд╣ рд╕рдм рдореИрдВ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓реАрдХреЗрд╢рди рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд░рддрд╛ рд╣реВрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ:

<TargetFramework>netcoreapp3.1</TargetFramework>

рдФрд░ рд╡рд┐рдВрдбреЛрдЬ 10 рдХреЗ рд╕рд╛рде рдореЗрд░реА рдорд╢реАрди рдкрд░ рд╕рдм рдХреБрдЫ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдбрд┐рдмрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВ WSL рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рдПрдХ System.IO.FileLoadException рддреНрд░реБрдЯрд┐ рдкрдХрдбрд╝рддрд╛ рд╣реВрдВ :

рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐ рдЬрд╛рдирдХрд╛рд░реА:
{
  "Type": "System.IO.FileLoadException",
  "Message": "Failed to load Xbim.Geometry.Engine64.dll",
  "TargetSite": "Void .ctor(Microsoft.Extensions.Logging.ILogger`1[Xbim.Geometry.Engine.Interop.XbimGeometryEngine])",
  "StackTrace": " at Xbim.Geometry.Engine.Interop.XbimGeometryEngine..ctor(ILogger`1 logger)\r\n at Xbim.Geometry.Engine.Interop.XbimGeometryEngine..ctor()\r\n at Xbim.ModelGeometry.Scene.Xbim3DModelContext.get_Engine()\r\n at Xbim.ModelGeometry.Scene.Xbim3DModelContext.CreateContext(ReportProgressDelegate progDelegate, Boolean adjustWcs)\r\n at My.Converter.ConvertIfc.CreateWebIfc(String ifcFileFullPath, String wexBIMFolder)",
  "Data": {},
  "InnerException": {
    "Type": "System.IO.FileNotFoundException",
    "Message": "Could not load file or assembly 'Xbim.Geometry.Engine.dll, Culture=neutral, PublicKeyToken=null'. The system cannot find the file specified.",
    "FileName": "Xbim.Geometry.Engine.dll, Culture=neutral, PublicKeyToken=null",
    "FusionLog": "",
    "TargetSite": "System.Reflection.RuntimeAssembly nLoad(System.Reflection.AssemblyName, System.String, System.Reflection.RuntimeAssembly, System.Threading.StackCrawlMark ByRef, Boolean, System.Runtime.Loader.AssemblyLoadContext)",
    "StackTrace": " at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, RuntimeAssembly assemblyContext, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, AssemblyLoadContext assemblyLoadContext)\r\n at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext)\r\n at System.Reflection.Assembly.Load(String assemblyString)\r\n at Xbim.Geometry.Engine.Interop.XbimGeometryEngine..ctor(ILogger`1 logger)",
    "Data": {},
    "Source": "System.Private.CoreLib",
    "HResult": -2147024894
  },
  "Source": "Xbim.Geometry.Engine.Interop",
  "HResult": -2146232799
}

рд╕рдХреНрд░рд┐рдп googling рдФрд░ рд╡рд┐рдЪрд╛рд░рд╢реАрд▓ рдкрдврд╝рдиреЗ рдХреЗ рдПрдХ рд╕рддреНрд░ рдиреЗ рдореБрдЭреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдореИрдВ рдмреЗрд╣рдж рдЕрд╕рд╛рд╡рдзрд╛рди рдерд╛:
Recently at work, we were evaluating a few options to render building models in the browser. Building Information Modeling (BIM) in interoperability scenarios is done via Industry Foundation Classes, mostly in the STEP Physical File format. The schema is quite huge and complex with all the things you have to consider, so we were glad to find the xBim open source project on GitHub. They've got both projects to visualize building models in the browser with WebGL as well as conversion tools to create the binary-formatted geometry mesh. To achieve that, native C++ libraries are dynamically loaded (so no .Net Core compatibility) which must be present in the bin folder. The C++ libraries are expected either in the same folder as the application binaries or in a x64 (or x86, respectively) sub folder (See here for more details). In regular projects, the xBim.Geometry NuGet package adds a build task to copy the dlls into the build output folder, but this doesn't work with the new tooling. You can, however, get it to work in Visual Studio 2015 by taking care of supplying the interop dlls yourself.

рдФрд░ рдРрд╕реА рд╣реА рдореБрд╢реНрдХрд┐рд▓реЗрдВ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдХреЗрд▓реЗ рдирд╣реАрдВ рд╣реИрдВред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ xBIM .Net Core рдХреЗ рддрд╣рдд рд╣реЛ ред
рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдмрджрд▓рддрд╛ рд╣реИ ... рд╕рдм рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ Xbim.Geometry.Engine64.dll рд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрдерддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ ред рдЖрдкрдХреЛ рдорд╢реАрди рдкрд░ vc_redist.x64.exe рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП ред рдореЗрд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреНрдпрд╛ рд╣реИрдВ?
рдкрд╣рд▓реА рдмрд╛рдд рдЬреЛ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛: "рдХреНрдпрд╛ рдПрдХ рдкреВрд░реНрдгред рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╡рд╛рд▓реЗ рд╡рд┐рдВрдбреЛрдЬ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?
рдЗрд╕ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ рд╕реНрдЯреВрдбрд┐рдпреЛ 2015, 2017 рдФрд░ 2019 рдХреЗ рд▓рд┐рдП Microsoft Visual C ++ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░реЗрдВ, рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЬрд╛рдПрдЧрд╛? тАЭ рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдХреА:

рдбреЙрдХрдЯрд░ рдХреЗ рд▓рд┐рдП Windows рдЫрд╡рд┐ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:
.Net Core :

<TargetFramework>net47</TargetFramework>

Dockerfile:

FROM microsoft/dotnet-framework:4.7
WORKDIR /bimlibconverter
COPY lib/VC_redist.x64.exe /VC_redist.x64.exe
RUN C:\VC_redist.x64.exe /quiet /install
COPY bin/Release .
ENTRYPOINT ["MyConverter.exe"]

рдЦреИрд░, рдпрд╣ рдХрд╛рдо рдХрд┐рдпрд╛ ... рдпрд╣ рдЬреАрд╡рд┐рдд рд╣реИ! рдкрд░рдВрддреБред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдореЗрдЬрдмрд╛рди рд▓рд┐рдирдХреНрд╕ рдорд╢реАрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдпрд╣ рдЙрд╕ рдкрд░ рд╡рд┐рдВрдбреЛрдЬ рд╕рд░реНрд╡рд░ рдХреЛрд░ рдкрд░ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ ред рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХреНрддрд╛ ...

рд╕рдордЭреМрддрд╛ рдФрд░ рдирд┐рдВрджрд╛


рд╡реЗрдм рдкрд░ рдПрдХ рдФрд░ рдЦреЛрдЬ рдореБрдЭреЗ рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд▓реЗ рдЖрдИ ред рдЗрд╕рдореЗрдВ, рд▓реЗрдЦрдХ рдХреЛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ:
рдЪреАрдЬреЛрдВ рдХреЛ рдмрджрддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП:
рд╕рднреА рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ 32-рдмрд┐рдЯреНрд╕ (x86) рд╣реИрдВред
рдХреБрдЫ рдХреЛ рджреГрд╢реНрдп C ++ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рд░рдирдЯрд╛рдЗрдо рдШрдЯрдХреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреБрдЫ рдХреЛ .NET рд░рдирдЯрд╛рдЗрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
рдХреБрдЫ рдХреЛ рдПрдХ рд╡рд┐рдВрдбреЛ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рд╣рдо рдХреЗрд╡рд▓ рдХрдорд╛рдВрдб-рд▓рд╛рдЗрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рд╕реАрдПрд▓рдЖрдИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдкреЛрд╕реНрдЯ рд▓рд┐рдирдХреНрд╕ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рд╡рд╛рдЗрди рдореЗрдВ рд╡рд┐рдВрдбреЛрдЬ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЬрд┐рдЬреНрдЮрд╛рд╕реБ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред

рдХреБрдЫ рдкрд░реАрдХреНрд╖рдг, рдмрдЧ рдФрд░ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рдмрд╛рдж, рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ:

рд╢рд░рд╛рдм рдХреЗ рд╕рд╛рде рдЙрдмрдВрдЯреВ-рдЖрдзрд╛рд░рд┐рдд рдбреЙрдХрдЯрд░ рдЫрд╡рд┐, .рдиреЗрдЯ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рдмреЛрд░реНрдб рдкрд░ vcredist:

FROM ubuntu:latest
#  x86
RUN dpkg --add-architecture i386 \
    && apt-get update \
    #   
    && apt-get install -qfy --install-recommends \
        software-properties-common \
        gnupg2 \
        wget \
        xvfb \
        cabextract \
    #  Wine
    && wget -nv https://dl.winehq.org/wine-builds/winehq.key \
    && apt-key add winehq.key \
    && apt-add-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ bionic main' \
    #     Wine
    && add-apt-repository ppa:cybermax-dexter/sdl2-backport \
    #  Wine
    && apt-get install -qfy --install-recommends \
        winehq-staging \
        winbind \
    # 
    && apt-get -y clean \
    && rm -rf \
      /var/lib/apt/lists/* \
      /usr/share/doc \
      /usr/share/doc-base \
      /usr/share/man \
      /usr/share/locale \
      /usr/share/zoneinfo
#    Wine
ENV WINEDEBUG=fixme-all
ENV WINEPREFIX=/root/.net
ENV WINEARCH=win64
#  Wine
RUN winecfg \
    # winetricks,   .Net Framework  
    && wget https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks \
    -O /usr/local/bin/winetricks \
    && chmod +x /usr/local/bin/winetricks \
# 
    && apt-get -y clean \
    && rm -rf \
      /var/lib/apt/lists/* \
      /usr/share/doc \
      /usr/share/doc-base \
      /usr/share/man \
      /usr/share/locale \
      /usr/share/zoneinfo \
    # Wine   
    && wineboot -u && winetricks -q dotnet472 && xvfb-run winetricks -q vcrun2015

WORKDIR /root/.net/drive_c/myconverter/

#  
COPY /bin/Release/ /root/.net/drive_c/myconverter/

ENTRYPOINT ["wine", "MyConverter.exe"]

UPD: . rueler

рдмрд┐рд▓реНрдб рдлрд╛рд╕реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд╛рдВрдЪ рдХрд░реЗрдВред рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ!

рдкрд░рд┐рдгрд╛рдо, рдирд┐рд╖реНрдХрд░реНрд╖, рд╡рд┐рдЪрд╛рд░


рдЗрд╕рдиреЗ рдХрд╛рдо рдХрд░ рджрд┐рдпрд╛ред рдЖрдЙрдЯрдкреБрдЯ рдбреЙрдХрдЯрд░ рдХрдВрдЯреЗрдирд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдирдХреНрд╕ рдЗрдореЗрдЬ рд╣реИред рдпрд╣ "puffy" (~ 5.2GB) рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рдЬрд▓реНрджреА рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдЕрдВрджрд░ .Net рдлреНрд░реЗрдорд╡рд░реНрдХ 4.7 рдкрд░ рдПрдХ рд╡рд┐рдВрдбреЛрдЬ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬреЛ RabbitMQ рдХреЛ рд╕реБрдирддрд╛ рд╣реИ, рдЧреНрд░реЗрдЧреНрд▓реЙрдЧ рдХреЛ рд▓реЙрдЧреНрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИ , рдФрд░ Minio рдореЗрдВ / рдкрд░ рдлрд╛рдЗрд▓ рдЕрдкрд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдореИрдВ рджреВрд░рд╕реНрде docker API рджреНрд╡рд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реВрдВрдЧрд╛ред

рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╡рд╛рджреА рд╕рдорд░реНрдкрд┐рдд рдХрд╛рд░реНрдп рдХрд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╢рд╛рдпрдж, рдФрд░ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рдирд╣реАрдВред рд▓реЗрдХрд┐рди рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ рдореИрдВ рд╕рдВрддреБрд╖реНрдЯ рдерд╛ред рд╢рд╛рдпрдж рдХрд┐рд╕реА рдХреЗ рдХрд╛рдо рднреА рдЖрдПрдЧрд╛ред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдореИрдВ рдкрд╣рд▓реА рдмрд╛рд░ рд╣реИрдмрд░ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реВрдВред рдЖрдкрдХреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдорд┐рд▓рддреЗ рд╣реИрдВред

All Articles