我有一个WSDL文件,定义了我必须在WCF中实现的服务.我已经读过我可以使用WSDL文件中的svcutil生成代理,然后我可以使用生成的接口来实现服务.
不幸的是,我似乎找不到让接口包含正确属性来公开合同的方法.
所有操作都具有"OperationContractAttribute"属性,但看起来好像要公开服务,我需要每个操作"OperationContract"."ServiceContractAttribute"和"ServiceContract"也是如此,我想象DataContract,但我还没有那么远.
我可以手动进行这些更改,但我更喜欢一种可以轻松使用现有代码的技术,或者可以为我的用途生成更好的代码.有什么方法可以做到这一点?
谢谢.
编辑:
使用的命令:
svcutil ObjectManagerService.wsdl /n:*,Sample /o:ObjectManagerServiceProxy.cs /nologo
Run Code Online (Sandbox Code Playgroud)
代码示例:
public interface ObjectManagerSyncPortType
{
// CODEGEN: Generating message contract since the operation createObject is neither RPC nor document wrapped.
[System.ServiceModel.OperationContractAttribute(Action="http://www.sample.com/createObject", ReplyAction="*")]
[System.ServiceModel.XmlSerializerFormatAttribute()]
Sample.createObjectResponse1 createObject(Sample.createObjectRequest1 request);
// ...
}
Run Code Online (Sandbox Code Playgroud)
尽我所知/看到WSDL文件完全是自包含的,不需要额外的XSD文件.
情况:自动生成的成员(例如MenuStrip项目)根据创建项目时输入的文本生成(自动生成的)名称.我最常见的情况是创建菜单条并通过输入文本添加菜单项(使用图形设计器).
由于我的GUI是希伯来语,所有这些成员都有一个包含希伯来语字符串的名称.像"(希伯来语文本)ToolStripItem"之类的东西.当我创建事件处理程序时,事件处理程序"继承"希伯来文本:"(希伯来语文本)ToolStripMenuItem_Click".
这实际上运行良好,IntelliSense对希伯来语文本没有问题,编译器也是如此.
问题是:我应该更改这些名称(或防止它们首先被创建)吗?保留这些名字可能带来的后果是什么?
编辑:澄清一下,当我说希伯来文时,我不是指用英文文字写的希伯来文,我指的是实际的希伯来文字.
文档说要查找"Microsoft.VisualStudio.Shell.Interop(在microsoft.visualstudio.shell.interop.dll中)",但我似乎无法找到它.
我正在考虑写作的方法
class MyClass {
@Get
@Set
protected int aValue;
}
然后,自动为类生成get_aValue()和set_AValue()方法.
我发现了这些可能性:
1a)在编译时.使用注释处理器分别处理MyClass.java,然后编写一个新的MyClass.java,最后使用后者(用原文替换)与.java的其余部分
1b)在编译时.使用注释处理器生成一个MyClassGenerated.java文件,其中包含一个新类(使用get/set方法),这个类是原始MyClass的子类.
2)在运行时.使用java.lang.instrument和外部工具(如BCEL)在MyClass.class中编写新代码.
嗯,问题是:考虑到我尽可能不想使用第三方库(如lombok项目或BCEL)
a)我错过了其他方法吗?
b)您会使用哪种方法?
我想我会用1a)因为
1b)不干净(程序的其余部分应该使用MyClassGeneradted而不是原始的MyClass,尽管它可能仅仅是名称问题)
2)真的很难(对我来说,至少).
eclipse,velocity或jet模板中最有用的代码生成工具是什么?任何人都有这方面的经验,知道赞成和利弊?
我正在处理一些报告(计数),我必须获取不同参数的计数.很简单,但很乏味.
一个参数的示例查询:
qCountsEmployee = (
"select count(*) from %s where EmployeeName is not null"
% (tablename)
)
CountsEmployee = execute_query(qCountsEmployee)
Run Code Online (Sandbox Code Playgroud)
现在我有几百个这样的参数!
我所做的是:创建所有参数的列表并使用快速Python脚本生成它们,然后复制该文本并将其放在主脚本中以避免繁琐的线条.
columnList = ['a', 'b', ............'zzzz']
for each in columnList:
print (
'q' + each + ' ='
+ '"select count(*) from %s where' + each
+ 'is not null" % (tablename)'
)
print each + ' = execute_query(' + 'q' + each + ')'
Run Code Online (Sandbox Code Playgroud)
虽然这种方法有效,但我想知道如果不是单独的脚本来生成代码行并将粘贴复制到主程序中,我是否可以直接在主脚本中生成它们并让脚本将它们视为代码行?这将使代码更具可读性是我的想法.希望我有道理!谢谢...
代码:
using (var codeProvider = new CSharpCodeProvider())
{
var compilerParameter = new CompilerParameters(
_assemblies, assemblyName, false)
{
GenerateInMemory = true,
CompilerOptions = "/optimize"
};
var compilerResults = codeProvider.CompileAssemblyFromDom(
compilerParameter, templateResults.Select(r => r.GeneratedCode)
.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
它抛出异常:CS1567生成Win32资源时出错:访问被拒绝.
这是什么意思?
当我尝试使用Rust时,我注意到如果从文字中创建一个盒装数组Box::new,则会从只读内存中额外复制到堆栈.为什么Rust编译器不能直接从只读内存复制到堆上分配的空间?
Rust代码的片段:
fn main() {
let v: Box<[u32]> = Box::new([1u32,2,3456,4,5,6]);
println!("vector {}", v.len());
}
Run Code Online (Sandbox Code Playgroud)
适当的汇编片段:
00000000000049d4 mov rax, qword [ds:0x39ad0]
00000000000049db mov qword [ss:rsp+arg_F8], rax
00000000000049e3 movaps xmm0, xmmword [ds:const1050]
00000000000049ea movaps xmmword [ss:rsp+arg_E8], xmm0
00000000000049f2 mov ecx, 0x18
00000000000049f7 mov edi, ecx ; argument #1 for method _ZN4heap15exchange_malloc20h356508549306a536JeaE
00000000000049f9 mov ecx, 0x4
00000000000049fe mov esi, ecx ; argument #2 for method _ZN4heap15exchange_malloc20h356508549306a536JeaE
0000000000004a00 call _ZN4heap15exchange_malloc20h356508549306a536JeaE ; heap::exchange_malloc::h356508549306a536Jea
0000000000004a05 mov rsi, qword [ss:rsp+arg_F8]
0000000000004a0d mov qword [ds:rax+0x10], rsi …Run Code Online (Sandbox Code Playgroud) 我一直在浏览Clang/LLVM源代码,我遇到了它的CodeModel属性CodeGenOptions.
基于这种方法,有效的价值似乎是:"small","kernel","medium"和"large".
这个属性控制什么?
如何为我的应用程序选择正确的值?
我需要@raw/filename在构建过程中生成原始XML文件(通过可访问的“原始”文件)。
我一直在尝试使用挂钩的自定义Gradle任务来完成此任务preBuild。然后,此任务将收集所需的所有要求并在下生成文件build/intermediates/res/main/raw。
到目前为止,一切都很好。我可以看到文件已正确生成。但是,我似乎无法从我拥有的任何其他XML资源文件中访问它。
我尝试将目标目录更改为,build/generated/source/res/main/raw但是问题仍然存在。
将其更改为可以src/main/res/raw工作,但随后我必须从git中排除生成的文件-我不想要那样。另外,似乎将生成的源文件与其书面对应文件驻留在同一目录中也很奇怪。
以下是我的自定义任务的简化代码段:
task(generateChangelogXml) {
def source = new File(rootProject.projectDir, "CHANGELOG")
def targetDir = new File(projectDir, "/build/intermediates/res/main/raw")
def target = new File(targetDir, "changelog_latest.xml")
def versionName = ""
def releaseDate = ""
def changes = new ArrayList<String>()
def reader = new BufferedReader(new FileReader(source))
def currLine = ""
while ((currLine = reader.readLine()) != null) {
// Truncated for brevity
}
target.withWriter { writer ->
writer.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
writer.write("<changelog bulletedList=\"true\">\n") …Run Code Online (Sandbox Code Playgroud) code-generation ×10
.net ×2
android ×1
annotations ×1
build ×1
c# ×1
c++ ×1
clang ×1
compilation ×1
dynamic ×1
eclipse ×1
gradle ×1
groovy ×1
interface ×1
java ×1
llvm ×1
non-english ×1
performance ×1
python ×1
rust ×1
svcutil.exe ×1
wcf ×1
wsdl ×1