# x86 Uygulamalarda OcrInternals Dağıtım Hatası
`IronTesseract.ReadScreenShot()`, yalnızca bir Windows x64 sürecinde desteklenen IronOCR'un AdvancedScan hattı üzerinden çalışır. x86 bir uygulamadan çağırmak `OcrInternals` dağıtım hatasıyla başarısız olur, `IronOcr.Extensions.AdvancedScan` paketi yüklendiğinde bile.
```txt
Error while reading a screenshot, Error while deploying OcrInternals for IronOcr:
'Unable to locate 'OcrInternals' in
...\bin\Debug\runtimes\win-x86\native,
...\bin\Debug\runtimes\win.6.2-x86\native,
...\bin\Debug\runtimes\win.6-x86\native,
...\bin\Debug\,
...
nor in an embedded resource.'
Please install the NuGet Package 'IronOcr.Extension.AdvancedScan' when using IronOcr on Windows.
[Issue Code IRONOCR-OCRINTERNALS-DEPLOYMENT-ERROR-WIN]
```
Hata, `ReadScreenShot()` çağrısının kendisinde ortaya çıkar:
```csharp
var ocr = new IronOcr.IronTesseract();
using (var input = new IronOcr.OcrInput())
{
input.LoadImage("Step_1-5.jpg");
var result = ocr.ReadScreenShot(input);
Console.WriteLine(result.Text);
}
```
`ReadScreenShot()`'nin bağımlı olduğu AdvancedScan yerel bileşenleri, bir x86 sürecinde desteklenmez. `IronOcr.Extensions.AdvancedScan` yüklenmesi gereklidir, ancak bu, host sürecin bitliğini değiştirmez, bu yüzden çağrı hâlâ x86 altında çalışamaz.
[[e:(AdvancedScan'i kurmak ReadScreenShot()'ı x86 prosesinde çalıştırmaz. Onu çağıran prosesin x64 olarak çalışması gerekir.)]]
## Çözüm
### Seçenek 1: Doğrudan x64'a Hedefleyin
En temiz çözüm, projenin platform hedefini doğrudan x64'e değiştirmektir. Visual Studio'da:
1. Projeye sağ tıklayın ve **Properties** seçin.
2. **Build** sekmesini açın.
3. **Platform hedefini** **x64** olarak ayarlayın.
4. **32-bit Tercih Etme** seçeneğini kaldırın.
5. Tekrar derleyin ve çalıştırın.
Host süreç x64 olarak çalıştığında, `ReadScreenShot()` desteklenen bir ortamda çalışır.
### Seçenek 2: Uygulamayı x86 Tutun ve x64 Bir Yardımcı Proses Çağırın
Ana uygulama x86 kalmalı olduğunda, yalnızca OCR işlemini küçük bir x64 yardımcı işleme taşıyın ve mevcut uygulamadan çağırın. Yapı şu şekilde görünür:
```txt
MainWinForms.x86
- .NET Framework Windows Forms app
- Platform target: x86
- Does not run ReadScreenShot() directly
- Calls the x64 helper process
OcrHelper.x64
- .NET Framework Console app
- Platform target: x64
- References IronOCR
- References IronOcr.Extensions.AdvancedScan
- Runs Ocr.ReadScreenShot()
- Returns the OCR result to the main app
```
x86 uygulaması dokunulmadan kalırken AdvancedScan desteklenen yerde çalışır.
#### x86 uygulamasından yardımı çağırma
Yardımcıyı `ProcessStartInfo` ile başlatın ve çıktısını okuyun:
```csharp
using System;
using System.Diagnostics;
using System.IO;
public static class OcrHelperClient
{
public static string ReadScreenshotWithHelper(string imagePath)
{
string helperExePath = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
"OcrHelper.x64",
"OcrHelper.x64.exe"
);
if (!File.Exists(helperExePath))
{
throw new FileNotFoundException("The OCR helper executable was not found.", helperExePath);
}
var startInfo = new ProcessStartInfo
{
FileName = helperExePath,
Arguments = "\"" + imagePath + "\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (var process = new Process())
{
process.StartInfo = startInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (process.ExitCode != 0)
{
throw new Exception("OCR helper failed: " + error);
}
return output;
}
}
}
```
Hem `StandardOutput` hem de `StandardError` yönlendirilmesi, çağıranın tanınan metni yakalamasına ve yardımcının çıkış kodundan herhangi bir hatayı ortaya çıkarmasına olanak tanır.
```csharp
string imagePath = @"C:\Images\Step_1-5.jpg";
string text = OcrHelperClient.ReadScreenshotWithHelper(imagePath);
Console.WriteLine(text);
```
#### x64 Yardımcısını Oluşturma
`IronOcr` ve `IronOcr.Extensions.AdvancedScan` referans alan bir x64 konsol uygulaması olarak yardımcıyı oluşturun. İlk argümandan görüntü yolunu okur, OCR çalıştırır ve sonucu `stdout` yazar:
```csharp
using System;
using System.IO;
using IronOcr;
namespace OcrHelper.x64
{
internal static class Program
{
private static int Main(string[] args)
{
try
{
if (args.Length == 0)
{
Console.Error.WriteLine("Missing image path argument.");
return 1;
}
string imagePath = args[0];
if (!File.Exists(imagePath))
{
Console.Error.WriteLine("Image file was not found: " + imagePath);
return 2;
}
string licenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");
if (!string.IsNullOrWhiteSpace(licenseKey))
{
License.LicenseKey = licenseKey;
}
var ocr = new IronTesseract();
using (var input = new OcrInput())
{
input.LoadImage(imagePath);
var result = ocr.ReadScreenShot(input);
Console.WriteLine(result.Text);
}
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.ToString());
return 99;
}
}
}
}
```
Farklı çıkış kodları (`1`, `2`, `99`), çağıran uygulamanın eksik bir argümanı eksik bir dosya veya beklenmeyen bir istisnadan ayırt etmesine olanak tanır.
## Üretim Kullanımı İçin Notlar
Örnek, sadelik için `stdout` kullanır. Üretim için, mimarinize uyan iletişim yöntemini seçin. Seçenekler şunları içerir:
- Standart çıkış ve standart hata.
- Geçici JSON dosyaları.
- Adlandırılmış borular.
- Yerel bir HTTP uç noktası.
- x64 OCR işlemini barındıran bir Windows Hizmeti.
**Küçük veya arada çağrılar için:** yardımı talep üzerine başlatmak genellikle iyidir. **Yüksek hacimli iş yükleri için:** her istek başına bir proses başlatmaktan daha verimli olma eğiliminde olan uzun süreli bir x64 yardımcı hizmeti genellikle daha iyidir.
## Hata Ayıklama İpuçları
Yardımcı yaklaşım kötü davranış gösterdiğinde şu kontrolleri gerçekleştirin:
- Ana uygulamanın gerçekten x86 kalması gerektiğini ve `Ocr.Read()`'nın ekran görüntüsü senaryosu için yeterli olmadığını doğrulayın.
- `ReadScreenShot()`'nin doğrudan bir x64 sürecinden çalıştırıldığında başarılı olduğunu doğrulayın.
- Yardımcı proje için **Platform hedefi: x64** ile oluşturun ve x86 uygulamanın hiçbir zaman `ReadScreenShot()`'yi kendisinin çağırmadığından emin olun.
- x64 yardımcı projede `IronOcr.Extensions.AdvancedScan` yükleyin.
- Yardımcı işlemin erişebileceği görüntü yolunun yardımcıya geçirildiğini kontrol edin.
- IronOCR lisans anahtarını kodda, uygulama konfigürasyonunda veya `IRONOCR_LICENSE_KEY` ortam değişkeninde yapılandırın.
Yardımcıyı yayınlarken, yalnızca `.exe` değil, tüm derleme çıktısını kopyalayın. Çıkış klasörü, tüm referans verilen bileşenleri ve yapıyla üretilen doğal çalışma zamanı dosyalarını içermelidir, aksi takdirde yardımcı aynı dağıtım hatasıyla karşılaşır.
IronTesseract.ReadScreenShot(), yalnızca bir Windows x64 sürecinde desteklenen IronOCR'un AdvancedScan hattı üzerinden çalışır. x86 bir uygulamadan çağırmak OcrInternals dağıtım hatasıyla başarısız olur, IronOcr.Extensions.AdvancedScan paketi yüklendiğinde bile.
Error while reading a screenshot, Error while deploying OcrInternals for IronOcr:'Unable to locate 'OcrInternals' in...\bin\Debug\runtimes\win-x86\native,...\bin\Debug\runtimes\win.6.2-x86\native,...\bin\Debug\runtimes\win.6-x86\native,...\bin\Debug\,...nor in an embedded resource.'Please install the NuGet Package 'IronOcr.Extension.AdvancedScan' when using IronOcr on Windows.[Issue Code IRONOCR-OCRINTERNALS-DEPLOYMENT-ERROR-WIN]
Error while reading a screenshot, Error while deploying OcrInternals for IronOcr:
'Unable to locate 'OcrInternals' in
...\bin\Debug\runtimes\win-x86\native,
...\bin\Debug\runtimes\win.6.2-x86\native,
...\bin\Debug\runtimes\win.6-x86\native,
...\bin\Debug\,
...
nor in an embedded resource.'
Please install the NuGet Package 'IronOcr.Extension.AdvancedScan' when using IronOcr on Windows.
[Issue Code IRONOCR-OCRINTERNALS-DEPLOYMENT-ERROR-WIN]
Text
Hata, ReadScreenShot() çağrısının kendisinde ortaya çıkar:
var ocr = new IronOcr.IronTesseract();using (var input = new IronOcr.OcrInput()){ input.LoadImage("Step_1-5.jpg"); var result = ocr.ReadScreenShot(input);Console.WriteLine(result.Text);}
var ocr = new IronOcr.IronTesseract();
using (var input = new IronOcr.OcrInput())
{
input.LoadImage("Step_1-5.jpg");
var result = ocr.ReadScreenShot(input);
Console.WriteLine(result.Text);
}
C#
ReadScreenShot()'nin bağımlı olduğu AdvancedScan yerel bileşenleri, bir x86 sürecinde desteklenmez. IronOcr.Extensions.AdvancedScan yüklenmesi gereklidir, ancak bu, host sürecin bitliğini değiştirmez, bu yüzden çağrı hâlâ x86 altında çalışamaz.
Dikkat: AdvancedScan'i kurmak ReadScreenShot()'ı x86 prosesinde çalıştırmaz. Onu çağıran prosesin x64 olarak çalışması gerekir.
Çözüm
Seçenek 1: Doğrudan x64'a Hedefleyin
En temiz çözüm, projenin platform hedefini doğrudan x64'e değiştirmektir. Visual Studio'da:
Projeye sağ tıklayın ve Properties seçin.
Build sekmesini açın.
Platform hedefinix64 olarak ayarlayın.
32-bit Tercih Etme seçeneğini kaldırın.
Tekrar derleyin ve çalıştırın.
Host süreç x64 olarak çalıştığında, ReadScreenShot() desteklenen bir ortamda çalışır.
Seçenek 2: Uygulamayı x86 Tutun ve x64 Bir Yardımcı Proses Çağırın
Ana uygulama x86 kalmalı olduğunda, yalnızca OCR işlemini küçük bir x64 yardımcı işleme taşıyın ve mevcut uygulamadan çağırın. Yapı şu şekilde görünür:
MainWinForms.x86 - .NET Framework Windows Forms app - Platform target: x86 - Does not run ReadScreenShot() directly - Calls the x64 helper processOcrHelper.x64 - .NET Framework Console app - Platform target: x64 - References IronOCR - References IronOcr.Extensions.AdvancedScan - Runs Ocr.ReadScreenShot() - Returns the OCR result to the main app
MainWinForms.x86
- .NET Framework Windows Forms app
- Platform target: x86
- Does not run ReadScreenShot() directly
- Calls the x64 helper process
OcrHelper.x64
- .NET Framework Console app
- Platform target: x64
- References IronOCR
- References IronOcr.Extensions.AdvancedScan
- Runs Ocr.ReadScreenShot()
- Returns the OCR result to the main app
Text
x86 uygulaması dokunulmadan kalırken AdvancedScan desteklenen yerde çalışır.
x86 uygulamasından yardımı çağırma
Yardımcıyı ProcessStartInfo ile başlatın ve çıktısını okuyun:
using System;using System.Diagnostics;using System.IO;public static class OcrHelperClient{ public static stringReadScreenshotWithHelper(string imagePath) { string helperExePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "OcrHelper.x64", "OcrHelper.x64.exe" ); if (!File.Exists(helperExePath)) { throw new FileNotFoundException("The OCR helper executable was not found.", helperExePath); } var startInfo = new ProcessStartInfo {FileName = helperExePath,Arguments = "\"" + imagePath + "\"",UseShellExecute = false,RedirectStandardOutput = true,RedirectStandardError = true,CreateNoWindow = true }; using (var process = new Process()) { process.StartInfo = startInfo; process.Start(); string output = process.StandardOutput.ReadToEnd(); string error = process.StandardError.ReadToEnd(); process.WaitForExit(); if (process.ExitCode != 0) { throw new Exception("OCR helper failed: " + error); } return output; } }}
using System;
using System.Diagnostics;
using System.IO;
public static class OcrHelperClient
{
public static string ReadScreenshotWithHelper(string imagePath)
{
string helperExePath = Path.Combine(
AppDomain.CurrentDomain.BaseDirectory,
"OcrHelper.x64",
"OcrHelper.x64.exe"
);
if (!File.Exists(helperExePath))
{
throw new FileNotFoundException("The OCR helper executable was not found.", helperExePath);
}
var startInfo = new ProcessStartInfo
{
FileName = helperExePath,
Arguments = "\"" + imagePath + "\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
using (var process = new Process())
{
process.StartInfo = startInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string error = process.StandardError.ReadToEnd();
process.WaitForExit();
if (process.ExitCode != 0)
{
throw new Exception("OCR helper failed: " + error);
}
return output;
}
}
}
C#
Hem StandardOutput hem de StandardError yönlendirilmesi, çağıranın tanınan metni yakalamasına ve yardımcının çıkış kodundan herhangi bir hatayı ortaya çıkarmasına olanak tanır.
string imagePath = @"C:\Images\Step_1-5.jpg";string text = OcrHelperClient.ReadScreenshotWithHelper(imagePath);Console.WriteLine(text);
string imagePath = @"C:\Images\Step_1-5.jpg";
string text = OcrHelperClient.ReadScreenshotWithHelper(imagePath);
Console.WriteLine(text);
C#
x64 Yardımcısını Oluşturma
IronOcr ve IronOcr.Extensions.AdvancedScan referans alan bir x64 konsol uygulaması olarak yardımcıyı oluşturun. İlk argümandan görüntü yolunu okur, OCR çalıştırır ve sonucu stdout yazar:
using System;using System.IO;using IronOcr;namespace OcrHelper.x64{ internal static class Program { private static intMain(string[] args) { try { if (args.Length == 0) {Console.Error.WriteLine("Missing image path argument."); return 1; } string imagePath = args[0]; if (!File.Exists(imagePath)) {Console.Error.WriteLine("Image file was not found: " + imagePath); return 2; } string licenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY"); if (!string.IsNullOrWhiteSpace(licenseKey)) {License.LicenseKey = licenseKey; } var ocr = new IronTesseract(); using (var input = new OcrInput()) { input.LoadImage(imagePath); var result = ocr.ReadScreenShot(input);Console.WriteLine(result.Text); } return 0; } catch (Exception ex) {Console.Error.WriteLine(ex.ToString()); return 99; } } }}
using System;
using System.IO;
using IronOcr;
namespace OcrHelper.x64
{
internal static class Program
{
private static int Main(string[] args)
{
try
{
if (args.Length == 0)
{
Console.Error.WriteLine("Missing image path argument.");
return 1;
}
string imagePath = args[0];
if (!File.Exists(imagePath))
{
Console.Error.WriteLine("Image file was not found: " + imagePath);
return 2;
}
string licenseKey = Environment.GetEnvironmentVariable("IRONOCR_LICENSE_KEY");
if (!string.IsNullOrWhiteSpace(licenseKey))
{
License.LicenseKey = licenseKey;
}
var ocr = new IronTesseract();
using (var input = new OcrInput())
{
input.LoadImage(imagePath);
var result = ocr.ReadScreenShot(input);
Console.WriteLine(result.Text);
}
return 0;
}
catch (Exception ex)
{
Console.Error.WriteLine(ex.ToString());
return 99;
}
}
}
}
C#
Farklı çıkış kodları (1, 2, 99), çağıran uygulamanın eksik bir argümanı eksik bir dosya veya beklenmeyen bir istisnadan ayırt etmesine olanak tanır.
Üretim Kullanımı İçin Notlar
Örnek, sadelik için stdout kullanır. Üretim için, mimarinize uyan iletişim yöntemini seçin. Seçenekler şunları içerir:
Standart çıkış ve standart hata.
Geçici JSON dosyaları.
Adlandırılmış borular.
Yerel bir HTTP uç noktası.
x64 OCR işlemini barındıran bir Windows Hizmeti.
Küçük veya arada çağrılar için: yardımı talep üzerine başlatmak genellikle iyidir. Yüksek hacimli iş yükleri için: her istek başına bir proses başlatmaktan daha verimli olma eğiliminde olan uzun süreli bir x64 yardımcı hizmeti genellikle daha iyidir.
Hata Ayıklama İpuçları
Yardımcı yaklaşım kötü davranış gösterdiğinde şu kontrolleri gerçekleştirin:
Ana uygulamanın gerçekten x86 kalması gerektiğini ve Ocr.Read()'nın ekran görüntüsü senaryosu için yeterli olmadığını doğrulayın.
ReadScreenShot()'nin doğrudan bir x64 sürecinden çalıştırıldığında başarılı olduğunu doğrulayın.
Yardımcı proje için Platform hedefi: x64 ile oluşturun ve x86 uygulamanın hiçbir zaman ReadScreenShot()'yi kendisinin çağırmadığından emin olun.
x64 yardımcı projede IronOcr.Extensions.AdvancedScan yükleyin.
Yardımcı işlemin erişebileceği görüntü yolunun yardımcıya geçirildiğini kontrol edin.
IronOCR lisans anahtarını kodda, uygulama konfigürasyonunda veya IRONOCR_LICENSE_KEY ortam değişkeninde yapılandırın.
Yardımcıyı yayınlarken, yalnızca .exe değil, tüm derleme çıktısını kopyalayın. Çıkış klasörü, tüm referans verilen bileşenleri ve yapıyla üretilen doğal çalışma zamanı dosyalarını içermelidir, aksi takdirde yardımcı aynı dağıtım hatasıyla karşılaşır.
Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.