我们一直在使用SAP"COM许可证桥"来访问其许可证服务器并以编程方式查询系统的硬件密钥(以重用自己的许可证).这在SAP Business One版本2007A,2007B和8.8上运行良好,但是在8.81中它们似乎更新了它们的CORBA接口而没有更新COM包装器,因为我们现在在尝试调用GetHardwareKey函数时获得了内存异常.
所以我下载了IIOP.NET并开始尝试编写自己的界面.无论如何我从来都不喜欢COM包装器.但我遇到了我的旧远程.NET远程控制 - 无法在服务器和客户端都没有定义公共接口的情况下调用远程方法.我尝试使用IIOP.NET附带的IDL到CLS编译器,但我继续得到关于接口beign不兼容的错误(SAP没有提供IDL文件).我不知道IIOP和CORBA如何确定接口是否兼容.但我甚至尝试调试IIOP.NET代码并强制它执行该方法,尽管不兼容,但收到一个空字符串而不是我想要的硬件密钥.
我的下一步是尝试实现虚假的许可证服务器并检查来自生产客户端的请求,以期确定它们应该是什么样子,但考虑到我遇到的困难,我并不指望取得多大的成功.深入了解.NET远程的内容.
我真正的问题是如何获取或生成SAP Business One硬件密钥,但由此产生的问题包括:
编辑:我设法通过应用RepositoryID属性使IIOP.NET/CORBA相信我有一个兼容的接口:
[Ch.Elca.Iiop.Idl.InterfaceType(Ch.Elca.Iiop.Idl.IdlTypeInterface.ConcreteInterface)]
[Ch.Elca.Iiop.Idl.RepositoryID("IDL:LicenseInfo:1.0")]
public interface ILicenseInfo : Ch.Elca.Iiop.Idl.IIdlEntity
{
void GetHardwareKey(out string hwKey);
}
Run Code Online (Sandbox Code Playgroud)
但我仍然得到一个空字符串结果.
编辑2:经过一些实验和调试之后,我发现响应消息确实包含了我正在寻找的数据,但是没有正确地解析成客户端值,可能是因为我的接口定义不好.希望进一步调试响应处理将帮助我弄清楚如何纠正我的界面.奇怪的是,它从响应中解析的第一件事是一个空的盒装值,这似乎不适合"out string"参数.
编辑3:我发现我需要将字符串属性应用于这样的参数,以防止它们被视为盒装值:
void GetHardwareKey([StringValue(), WideChar(true)] out string hwKey);
Run Code Online (Sandbox Code Playgroud)
但是,尽管有WideChar属性,我对CodeSet不支持WChar或其他东西的错误.我已经非常接近搞清楚了.
编辑4:我对如何为WChar设置代码集感到困惑.如果我没有设置它,我收到一个错误:"未指定或不支持WChar代码集." 因为服务器返回了一个unicode字符串而没有覆盖默认字符集.我找不到任何方法来覆盖客户端.我试着打电话:
omg.org.CORBA.OrbServices.GetSingleton().OverrideDefaultCharSets(
CharSet.UTF8, WCharSet.UTF16);
Run Code Online (Sandbox Code Playgroud)
但这似乎对客户端没有任何影响.示例代码显示在服务器端调用它.但我没有写服务器,所以我无法控制它.我唯一的选择是为了我自己的目的重写IIOP.NET代码,强制默认的WChar CodeSet生效?
我开始使用一个非常复杂的客户端和服务器系统,带有COM引用和其他东西,我一直在减少,直到我意识到我甚至无法获得Microsoft示例代码来管理受管COM服务器的免注册COM激活用C#编写.
服务器代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices.ComTypes;
using System.Runtime.InteropServices;
using System.ComponentModel;
namespace ClassLibrary1
{
[Guid("A7AC6D8C-FF17-4D2C-A3B1-2C8690A8EA04")
,ComVisible(true)]
public interface IClass1
{
[DispId(1)]
string DummyFunction(string inputValue);
}
[Guid("81723475-B5E3-4FA0-A3FE-6DE66CEE211C"),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(IClass1)),
ComVisible(true)]
public class Class1 : IClass1
{
public string DummyFunction(string inputValue)
{
return inputValue.Substring(0, 1) + " Inserted " + inputValue.Substring(1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
客户端VB6代码:
Dim c As ClassLibrary1.Class1
Set c = New Class1
MsgBox c.DummyFunction("Ben")
Run Code Online (Sandbox Code Playgroud)
客户端C++代码:
#include "stdafx.h"
#import <ClassLibrary1.tlb> raw_interfaces_only
using namespace ClassLibrary1;
int _tmain(int …Run Code Online (Sandbox Code Playgroud) 我正在使用LINQ to SQL和支持分布式事务的第三方SDK.当我意识到挂起的更新将更新第三方SDK中的SQL记录和记录时,我正在创建一个具有0(可能是无限的)超时的TransactionScope(尽管我还尝试了12小时作为时间跨度参数).然后我在环境事务(由transactionscope创建)上使用GetDtcTransaction来获取DTC事务以链接到第三方SDK.事情很好地工作了大约10分钟,但在10分钟后,事务消失并发生错误.如何确定交易消失的原因.我怀疑这是暂停,因为它经常在10分钟后发生,即使在那时已经完成了稍微不同程度的工作.但我对如何确定终止交易的原因,原因以及如何延长其生命感到茫然.
我尝试使用SQL事件探查器跟踪以下事件:
所有我在错误发生时都会遇到以下事件:
<Event id="19" name="DTCTransaction">
<Column id="3" name="DatabaseID">1</Column>
<Column id="11" name="LoginName">sa</Column>
<Column id="35" name="DatabaseName">master</Column>
<Column id="51" name="EventSequence">167065</Column>
<Column id="12" name="SPID">10</Column>
<Column id="60" name="IsSystem">1</Column>
<Column id="1" name="TextData">{D662BBC4-21EC-436D-991C-DCB061A34782}</Column>
<Column id="21" name="EventSubClass">16</Column>
<Column id="25" name="IntegerData">0</Column>
<Column id="41" name="LoginSid">01</Column>
<Column id="49" name="RequestID">0</Column>
<Column id="2" name="BinaryData">C4BB62D6EC216D43991CDCB061A34782</Column>
<Column id="14" name="StartTime">2009-11-11T13:55:32.82-06:00</Column>
<Column id="26" name="ServerName">.</Column>
<Column id="50" name="XactSequence">0</Column>
</Event>
<Event id="33" name="Exception">
<Column id="3" name="DatabaseID">9</Column>
<Column id="11" name="LoginName">sa</Column>
<Column id="31" name="Error">1222</Column>
<Column id="35" name="DatabaseName">ACS</Column>
<Column id="51" name="EventSequence">167066</Column>
<Column id="12" name="SPID">19</Column>
<Column id="20" …Run Code Online (Sandbox Code Playgroud) TFS 2010公开了一个"Build Number Format"属性,它包含$(BuildNumberDefinitionName)和$(Rev:.r)变量(以及其他内容).我问题的两个半部分:
这里可以使用的所有可用变量是什么?
$(Rev:.r)的值来自哪里(存储在哪里)?
一个.可以重置或更改吗?
我不清楚序列化/反序列化应该如何处理JavaScript中的类型化对象.例如,我有一个包含各种成员和数组的"MapLayer"对象.我已编写(但尚未测试)以下代码以尝试序列化它:
MapLayer.prototype.serialize = function() {
var result = "{tileset:tilesets." + tilesets.getTilesetName(this.tileset) + ",columns:" + this.columns + ",rows:" + this.rows +
",offsetX:" + this.offsetX + ",offsetY:" + this.offsetY + ",currentX:" + this.currentX + ",currentY:" + this.currentY +
",scrollRateX:" + this.scrollRateX + ",scrollRateY:" + this.scrollRateY + ",virtualColumns:" + this.virtualColumns + ",virtualRows:" + this.virtualRows +
",tiles:\"" + this.encodeTileData2() + "\"";
for(key in this)
{
if(this[key] instanceof Sprite)
result += "," + key + ":" + this[key].serialize();
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何将结果对象作为MapLayer对象而不是通用对象进行反序列化.如何将所有Sprite实例作为精灵进行反序列化.我应该使用"new MapLayer()"而不是"{}"吗?或者我只是想在序列化中包含对象的原型和构造函数属性?还有什么我想念的吗?我这样做是一种愚蠢的方式吗?我没有使用通用序列化/反序列化代码有两个原因:
我有一类可能有很多实例(在移动设备上),所以我试图最小化大小.我的一个字段是"DrawTarget",它指示是否忽略绘图操作,排队到路径或绘制到显示.我希望它只占用一个字节,因为只有3个可能的值,但我还希望它是友好的代码,所以我没有全部硬编码的数字.一种想法是使用枚举像:
public enum DrawTarget {
Invisible,
Path,
Canvas
}
Run Code Online (Sandbox Code Playgroud)
但是根据我的阅读,Java枚举不允许您指定内存布局 - 我不能请求枚举值表示字节大小的值 - 我想枚举值最终是整数大小的值在Java中.
所以我想可能在枚举中创建一个隐式转换运算符...这在Java中是否可行?或者是我在枚举中实现类似内容的最佳选择:
public static DrawTarget fromValue(byte value) {
switch (value) {
case 0:
return Invisible;
case 1:
return Path;
default:
return Canvas;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在我想要访问值的地方调用DrawTarget.fromValue?
或者我应该创建一个单字节类,因为显然(从我在研究中看到的)枚举基本上只是Java中的特殊类?
public class DrawTarget {
public static final byte Invisible = 0;
public static final byte Path = 1;
public static final byte Canvas = 2;
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用最后的解决方案,如何表示枚举实例的值?我仍然需要一种方法来允许"="运算符接受类的一个静态字段......比如转换构造函数或赋值运算符重载.
但是,我怀疑任何类对象作为引用类型,每个实例都需要多于一个字节.真的吗?
发表于游戏开发:用于平台游戏的2D物理引擎 - 骑在平台上
我有很多关于在平台游戏中使用2D物理引擎的问题,但是我正在努力解决的一个主要问题.我设法将Physics2D.Net引擎集成到Scrolling Game Development Kit 2项目中.我对物理学的表现和现实感到非常满意.但是,我失去了一些东西,我原来的SGDK2物理引擎(更专门针对平台游戏)变得更容易:
我认为使用WPF和XAML创建我的应用程序会使它更具可移植性,甚至可以通过网络执行,但我无法弄清楚它如何与VS 2012一起工作.我正在查看的资源是说我需要创建一个XBAP,在VS 2010中创建一个新项目时应该是一个选项.但是我在VS 2012中选择新的C#应用程序是:
我将我的应用程序创建为WPF应用程序,并将其切换到目标.NET 3.5客户端配置文件,以便更向后兼容.但无论我的应用程序是嵌入在ZIP文件中还是作为直接EXE提供,Chrome和IE 9都报告它可能是恶意的.我不记得以前在.NET之前的可执行文件中都会收到如此惊人的警告.为什么浏览器对应该能够在沙盒更安全的环境中运行的应用程序的突然危言耸听响应不会少?
我尝试过签署程序集并提供ClickOnce安装程序并签署ClickOnce清单.这允许它在IE中运行得更好,但不能在Chrome中运行.
我尝试将项目安全设置切换为"这是一个部分信任应用程序",但这会产生错误"该程序集不允许部分信任的调用者".当我添加[assembly: System.Security.AllowPartiallyTrustedCallers]到AssemblyInfo.cs中,然后我得到一个错误尝试加载PresentationFramework.dll:"请求类型System.Security.Permissions.UIPermission,mscorlib中的"许可,版本= 2.0.0.0,文化=中性公钥= b77a5c561934e089'失败了."
XBAP发生了什么?VS 2012 Express无法创建浏览器应用程序吗?
我想让我的应用程序的所有URI启动我的应用程序,如果它已安装.如果没有安装,我想显示一个关于我的应用程序的网页.看了以下两个问题后,我仍然找不到可靠的解决方案.
Intent过滤器适用于Google+,但不适用于Chrome和Facebook
Android - 如果未安装应用程序,则重定向存储(从网站启动)
第一个解决方案(重定向)的问题是,当未安装应用程序时,重定向到自定义协议会导致错误页面,如第二个问题中所述.第二个解决方案(使用具有服务器名称的意图过滤器的http协议)的问题在于Chrome不支持意图过滤器,如第一个问题中所述.所以现在的问题是,有没有办法防止在没有安装支持的应用程序时发生重定向?
我甚至不知道一周前就存在Unicode替换字符( ).现在我知道至少在SQL中似乎存在一些非常特殊和奇怪的逻辑.例如:
select replace(N'bl' + NCHAR(65533) + N'rt', NCHAR(65533), N'X')
Run Code Online (Sandbox Code Playgroud)
返回bl rt而不是blXrt.和:
select CHARINDEX(NCHAR(65533), N'b' + NCHAR(65533) + N't')
Run Code Online (Sandbox Code Playgroud)
返回0而不是2.我只是想确定表中的哪些字符串包含这个字符,我找不到一种直接的方法来执行它.对这个角色的处理是如此奇怪,必须有更多我可以了解它.定义的行为在哪里,更具体地说,在MS SQL Server数据库中查找包含此字符的字符串的最简单方法是什么?
编辑 对于试验答案的任何人,我建议您根据以下数据测试您的答案:
create table Test([Value] nvarchar(100) not null)
insert into Test([Value]) values('b' + NCHAR(65533) + 't')
insert into Test([Value]) values('b?t')
insert into Test([Value]) values('bat')
Run Code Online (Sandbox Code Playgroud)