Я пытаюсь использовать StartXpsPrintJob1
API в C #.
Однако я не смог найти никакой информации об этом с помощью Google. Этот метод не указан в pinvoke.net.
Кажется, я должен перевести код C ++, включая классы и интерфейсы, в C # и использовать какой-то dllimport
? К сожалению, я ничего не знаю о C ++.
Как я могу достичь этого?
Кажется, я должен перевести код C ++, включая классы и интерфейсы, в C # и использовать какой-то dllimport?
Вы можете сэкономить время и силы и использовать инструмент под названием SWIG, (Страница проекта Sourceforge) для генерации кода на C #, который генерирует dllimport.
Как пользоваться:
Скачать SWig для окон
Создайте заголовочный файл c ++, который представляет StartXpsPrintJob1 , назовите файл xpsheader.h
создать файл интерфейса, например, example.i
%module example
%{
/* Includes the header in the wrapper code */
#include "xpsheader.h"%}
/* Parse the header file to generate wrappers */
%include "xpsheader.h"
Запустите команду:
swig -csharp example.i
Инструмент генерирует удар файлов с одним файлом с именем examplePINVOKE.cs
На самом деле, важно знать, что SWIG является довольно полным компилятором C ++ с поддержкой практически всех языковых функций. Это включает в себя предварительную обработку, указатели, классы, наследование и даже шаблоны C ++. SWIG также можно использовать для упаковки структур и классов в прокси-классы на целевом языке c #, что очень естественным образом раскрывает базовые функции.
Ошибка «неверная сборка», вероятно, возникнет, если вы попытаетесь импортировать файл XpsPrint.dll в свой проект в виде библиотеки .Net: на самом деле это библиотека «родного кода» 🙁
Теоретически, вы должны иметь возможность скопировать / вставить этот пример в новый проект MSVS / C #:
Вы заметите, что он просто «печатает» — он не использует специфичные для XPS API.
Если это не работает для вас, эта ссылка также может помочь:
Наконец, обратите внимание на документацию Microsoft:
https://msdn.microsoft.com/en-us/library/windows/desktop/ff686814(v=vs.85).aspx
[API печати XPS не поддерживается и может быть изменен или недоступен
в будущем. Клиентские приложения должны использовать печатный документ
Пакет API вместо этого.]