我需要使用很久以前在Delphi中开发的COM组件(dll).问题是:dll不包含类型库...并且.NET中的每个互操作功能(例如,TlbImp)似乎都依赖于TLB.这个组件已经在Delphi程序中使用了很多年没有问题,因为"使用Delphi的COM对象并不是什么问题,因为我们知道接口"(引用Delphi开发人员).
有没有办法在没有TLB的情况下从c#中使用这个DLL?我已经使用DLL作为未试过,但唯一的方法是出口DllUnregisterServer,DllRegisterServer,DllCanUnloadNow和DllGetClassObject.我知道我将要使用的类和函数的名称,如果这可以有任何帮助.
更新: 我已经尝试过实施Jeff的建议,但是我收到了这个错误:
"无法将'ComTest.ResSrvDll'类型的COM对象强制转换为接口类型'ComTest.IResSrvDll'.此操作失败,因为对于具有IID'{75400500-939F-11D4-9E44-0050040CE72C}的接口的COM组件上的QueryInterface调用'由于以下错误而失败:不支持此类接口(来自HRESULT的异常:0x80004002(E_NOINTERFACE))."
这就是我所做的:
我从其中一个Delphi人那里得到了这个接口定义:
unit ResSrvDllIf;
interface
type
IResSrvDll = interface
['{75400500-939F-11D4-9E44-0050040CE72C}']
procedure clearAll;
function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString;
const aResFileName: WideString; aResShared: Integer): Integer; {safecall;}
...
end;
implementation
end.
Run Code Online (Sandbox Code Playgroud)
从这个我做了这个界面
using System.Runtime.InteropServices;
namespace ComTest
{
[ComImport]
[Guid("75400500-939F-11D4-9E44-0050040CE72C")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IResSrvDll
{
int ResObjOpen(string aClientID, string aClientSubID, string aResFileName, int aResShared);
}
}
Run Code Online (Sandbox Code Playgroud)
而这个coclass(得到了德尔福人的指导)
using System.Runtime.InteropServices;
namespace ComTest
{
[ComImport]
[Guid("75400503-939F-11D4-9E44-0050040CE72C")]
public class ResSrvDll
{
} …Run Code Online (Sandbox Code Playgroud) 我有一个场景,我必须从我的CompositionContainer实例导出,但我只有一个类型可以使用; 我不知道编译时的类型,因此我无法以通常的通用方式检索导出的对象.
通常你会这样做:
_container.GetExportedObject<IMyType>();
Run Code Online (Sandbox Code Playgroud)
但就我而言,我有这个:
Type someType = ... ;
_container.HowDoIGetTheExport(someType);
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
下面的实现是否是线程安全的?如果不是我错过了什么?我应该在volatile某个地方有关键字吗?或者在OnProcessingCompleted方法的某个地方锁定?如果是的话,在哪里?
public abstract class ProcessBase : IProcess
{
private readonly object completedEventLock = new object();
private event EventHandler<ProcessCompletedEventArgs> ProcessCompleted;
event EventHandler<ProcessCompletedEventArgs> IProcess.ProcessCompleted
{
add
{
lock (completedEventLock)
ProcessCompleted += value;
}
remove
{
lock (completedEventLock)
ProcessCompleted -= value;
}
}
protected void OnProcessingCompleted(ProcessCompletedEventArgs e)
{
EventHandler<ProcessCompletedEventArgs> handler = ProcessCompleted;
if (handler != null)
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
注意:我有私有事件和显式接口的原因是因为它是一个抽象基类.从它继承的类不应该直接对该事件做任何事情.添加了类包装器,使其更清晰=)
我目前有一个自动化的Windows应用程序,每天运行.目的是访问webservice以下载数据集,插入到sql 2005数据库中.
Windows服务应用程序是否适用于这种情况,是否会更灵活,并且性能会更好.
我需要在同一个父页面中打开链接,而不是在新页面中打开它.
注意:iframe和父页面是同一个域.
假设我有以下(简单的简单)基类:
public class Simple
{
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我现在想要做以下事情:
public class PathValue : Simple
{
[XmlAttribute("path")]
public string Value { get; set; }
}
public class ObjectValue : Simple
{
[XmlAttribute("object")]
public string Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
但实际上没有重新定义财产.我想将属性应用于基类的成员.这可能吗?
真正的问题是,在我从/到XML的序列化机制(它工作得非常出色),我发现很多类似的元素只有属性的名称不同(它们不一致,我不控制格式).现在我需要为每个这样的元素创建一个不同的类,而它们就像100%相同(除了属性).
我不认为这是可能的,但你可能永远不会知道.
更新:
我试过Marc的方法,但无济于事:
public class Document
{
public PathValue Path;
public ObjectValue Object;
}
class Program
{
static void Main(string[] args)
{
var doc = new Document()
{
Path = new PathValue() { Value …Run Code Online (Sandbox Code Playgroud) 我有2个模型我使用这个模型在评论中显示头像.
django_comments:
user_id
comment
.....
Run Code Online (Sandbox Code Playgroud)
myapp_profile
user_id
image_path
......
Run Code Online (Sandbox Code Playgroud)
其实我正在用cursor.execute()进行原始查询,以获取此数据
------- ---------- -------
'user_id' 'image_path' 'comment'
------- ---------- -------
3 name.jpg test
Run Code Online (Sandbox Code Playgroud)
但我想用"django orm方式"做
有解决方案吗
谢谢
是否有快速内置的方法将ALPHA-2(GB)转换为C#中的ALPHA-3(GBR),而无需创建所有数组.
我有一个宽度为200px的div.它不显示水平滚动条.现在,如果有人输入任何超过200px的单词,它就会被隐藏起来.我想知道是否可以在每个单词达到200px长度后自动添加换行符?
感谢您的时间.
我试过这个:
INSERT INTO tbl_vaucher
(
vaucher_name,
created_date
)
VALUES (
( SELECT TOP 1
con_full_name
FROM tbl_contact
),
GETDATE()
)
Run Code Online (Sandbox Code Playgroud)
,得到:Subqueries are not allowed in this context. Only scalar expressions are allowed.
我需要一个没有功能的解决方案.
c# ×5
sql ×2
.net ×1
asp.net ×1
attributes ×1
automation ×1
com ×1
delphi ×1
django ×1
events ×1
html ×1
html-target ×1
hyperlink ×1
iframe ×1
interop ×1
javascript ×1
mef ×1
orm ×1
performance ×1
t-sql ×1
web-services ×1