SWIG 和 C#:插入空 C# class
SWIG and C#: insert empty C# class
有没有办法(typemap 或 pragma)将自定义 C# class 插入到生成的 C# 代码中?使用 %typemap(cscode)
将代码添加到包装的 C++ classes 很容易 - 但添加 C# classes...
不清楚
例如,用于创建自定义异常的 SWIG doc 表示:
除了手工制作外,还必须使用上面的样板代码CustomApplicationException
:
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
但是不清楚如何通过接口文件添加class
有一个已记录的 pragma 接近您想要的,%pragma(csharp) imclasscode
。这会将代码插入到生成的 modulePINVOKE.cs 文件中。
在 SWIG 的源代码树中我们发现:
/* -----------------------------------------------------------------------------
* pragmaDirective()
*
* Valid Pragmas:
* imclassbase - base (extends) for the intermediary class
* imclassclassmodifiers - class modifiers for the intermediary class
* imclasscode - text (C# code) is copied verbatim to the intermediary class
* imclassimports - import statements for the intermediary class
* imclassinterfaces - interface (implements) for the intermediary class
*
* modulebase - base (extends) for the module class
* moduleclassmodifiers - class modifiers for the module class
* modulecode - text (C# code) is copied verbatim to the module class
* moduleimports - import statements for the module class
* moduleinterfaces - interface (implements) for the module class
*
* ----------------------------------------------------------------------------- */
virtual int pragmaDirective(Node *n) {
因此,假设您对以下嵌套 class 感到满意:
%module test
%pragma(csharp) modulecode=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
%}
在 module.cs 中完全符合您的要求。如果这还不够,那么我们将不得不开始寻找解决方法,并且在 SWIG 之外(但在同一源代码树中)手动编写小的独立代码块可能会变得更清晰、更简单。
如果您真的想进入解决方法领域,您可以(滥用)使用模块class修饰符编译指示将内容插入全局命名空间,例如:
%module test
%pragma(csharp) moduleclassmodifiers=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
public class%}
产生test.cs:
using System;
using System.Runtime.InteropServices;
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
public class test {
}
有没有办法(typemap 或 pragma)将自定义 C# class 插入到生成的 C# 代码中?使用 %typemap(cscode)
将代码添加到包装的 C++ classes 很容易 - 但添加 C# classes...
例如,用于创建自定义异常的 SWIG doc 表示:
除了手工制作外,还必须使用上面的样板代码CustomApplicationException
:
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
但是不清楚如何通过接口文件添加class
有一个已记录的 pragma 接近您想要的,%pragma(csharp) imclasscode
。这会将代码插入到生成的 modulePINVOKE.cs 文件中。
在 SWIG 的源代码树中我们发现:
/* ----------------------------------------------------------------------------- * pragmaDirective() * * Valid Pragmas: * imclassbase - base (extends) for the intermediary class * imclassclassmodifiers - class modifiers for the intermediary class * imclasscode - text (C# code) is copied verbatim to the intermediary class * imclassimports - import statements for the intermediary class * imclassinterfaces - interface (implements) for the intermediary class * * modulebase - base (extends) for the module class * moduleclassmodifiers - class modifiers for the module class * modulecode - text (C# code) is copied verbatim to the module class * moduleimports - import statements for the module class * moduleinterfaces - interface (implements) for the module class * * ----------------------------------------------------------------------------- */ virtual int pragmaDirective(Node *n) {
因此,假设您对以下嵌套 class 感到满意:
%module test
%pragma(csharp) modulecode=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
%}
在 module.cs 中完全符合您的要求。如果这还不够,那么我们将不得不开始寻找解决方法,并且在 SWIG 之外(但在同一源代码树中)手动编写小的独立代码块可能会变得更清晰、更简单。
如果您真的想进入解决方法领域,您可以(滥用)使用模块class修饰符编译指示将内容插入全局命名空间,例如:
%module test
%pragma(csharp) moduleclassmodifiers=%{
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
public class%}
产生test.cs:
using System;
using System.Runtime.InteropServices;
// Custom C# Exception
public class CustomApplicationException : global::System.ApplicationException {
public CustomApplicationException(string message)
: base(message) {
}
}
public class test {
}